Skip to content

Instantly share code, notes, and snippets.

@ignatenkobrain
Created July 24, 2015 12:26
Show Gist options
  • Save ignatenkobrain/43b8422d0786508e6309 to your computer and use it in GitHub Desktop.
Save ignatenkobrain/43b8422d0786508e6309 to your computer and use it in GitHub Desktop.
15:25:10 DEBUG application.py:54 |gnomenews.application.create_cache(<Application object at 0x7f7fa1698ea0 (gnomenews+application+Application at 0x5606cd2a62a0)>), returned None
15:25:10 DEBUG application.py:30 gnomenews.application.__init__(<Application object at 0x7f7fa1698ea0 (uninitialized at 0x0)>), returned None
15:25:10 DEBUG application.py:60 gnomenews.application.do_startup(<Application object at 0x7f7fa1698ea0 (gnomenews+application+Application at 0x5606cd2a62a0)>), returned None
15:25:10 DEBUG tracker.py:32 |gnomenews.tracker.__init__(<Tracker object at 0x7f7fa16a67e0 (uninitialized at 0x0)>), returned None
15:25:10 DEBUG window.py:46 |gnomenews.window.restore_saved_size(<Window object at 0x7f7fa16a1dc8 (gnomenews+window+Window at 0x5606cd512270)>), returned None
15:25:10 DEBUG toolbar.py:68 |||||gnomenews.toolbar.reset_header_title(<Toolbar object at 0x7f7fa16ad828 (gnomenews+toolbar+Toolbar at 0x5606cd3edf80)>), returned None
15:25:10 DEBUG toolbar.py:94 ||||gnomenews.toolbar._update(<Toolbar object at 0x7f7fa16ad828 (gnomenews+toolbar+Toolbar at 0x5606cd3edf80)>), returned None
15:25:10 DEBUG toolbar.py:88 |||gnomenews.toolbar.set_state(<Toolbar object at 0x7f7fa16ad828 (gnomenews+toolbar+Toolbar at 0x5606cd3edf80)>, 0), returned None
15:25:10 DEBUG toolbar.py:36 ||gnomenews.toolbar.__init__(<Toolbar object at 0x7f7fa16ad828 (uninitialized at 0x0)>, <Window object at 0x7f7fa16a1dc8 (gnomenews+window+Window at 0x5606cd512270)>), returned None
15:25:10 DEBUG view.py:32 |||gnomenews.view.__init__(<NewView object at 0x7f7fa16b4ee8 (uninitialized at 0x0)>, <Tracker object at 0x7f7fa16a67e0 (gnomenews+tracker+Tracker at 0x5606cd3ec7a0)>, 'new', 'New'), returned None
15:25:10 DEBUG view.py:32 |||gnomenews.view.__init__(<FeedsView object at 0x7f7fa16b0438 (uninitialized at 0x0)>, <Tracker object at 0x7f7fa16a67e0 (gnomenews+tracker+Tracker at 0x5606cd3ec7a0)>, 'feeds', 'Feeds', True), returned None
15:25:10 DEBUG view.py:32 |||gnomenews.view.__init__(<StarredView object at 0x7f7fa16b08b8 (uninitialized at 0x0)>, <Tracker object at 0x7f7fa16a67e0 (gnomenews+tracker+Tracker at 0x5606cd3ec7a0)>, 'starred', 'Starred'), returned None
15:25:10 DEBUG
SELECT
nie:url(?msg) AS url
nie:title(?msg) AS title
nco:fullname(?creator) AS fullname
nie:url(?website) AS author_homepage
nco:emailAddress(?email) AS author_email
nie:contentCreated(?msg) AS date
nmo:htmlMessageContent(?msg) AS content
nmo:isRead(?msg) AS is_read
WHERE
{ ?msg a mfo:FeedMessage ; nmo:isRead false; nco:creator ?creator.
OPTIONAL {?creator nco:hasEmailAddress ?email } .
OPTIONAL {?creator nco:websiteUrl ?website }
}
ORDER BY DESC (nie:contentCreated(?msg))
LIMIT 10
15:25:10 DEBUG tracker.py:285 |||||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16b0c18 (TrackerDBCursor at 0x5606cd747720)>), returned {'fullname': 'Adam Šamalík', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://pbs.twimg.com/profile_images/505677536232091648/N1HMnx1h_400x400.jpeg" alt="" style="float: right;"/>\n <p>As in the last year, July, for some reason, happened to be a great time to post some news about our <a href="http://copr.fedoraproject.org">Copr Build Service</a>. At this time, it’s about integrating Copr with:</p>\n<ul>\n<li><a href="http://www.patternfly.org">Patternfly</a> – an open interface project</li>\n<li><a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a remote Git repository designed to hold RPM package sources</li>\n</ul>\n<p><em>If you can’t wait to see it, you can check <a href="http://copr-fe-dev.cloud.fedoraproject.org/">the development server</a> that is hopefully running on <a href="http://copr-fe-dev.cloud.fedoraproject.org/">copr-fe-dev.cloud.fedoraproject.org</a>. But please, remember, it’s a development server – so all the projects built here are a subject of deletion, destruction and all kinds of randomization without notice.</em></p>\n<h3>Dist Git for Copr</h3>\n<p>It all started with a need of <strong>uploading sources</strong> to the Copr itself – as the only way of building your package was to provide a URL pointing to it. That, however, required all users to have their own public file storage.</p>\n<p>We decided to go the Fedora way and use <a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a combination of git repository to store spec files, lookaside cache to store sources, and Gitolite to manage access permissions. Each package will be stored in a repo named as ‘username/project/package’. Each repo will contain branches that represent a target platform. For example: ‘f22′ for Fedora 22, ‘epel7′ for Epel for Centos 7, etc.</p>\n<p><img src="https://github.com/release-engineering/dist-git/raw/master/images/storage.png" alt="" height="1150" class="aligncenter" width="1592"/></p>\n<p>It will be gradually deployed in production. The first step is to <strong>enable users to upload their .src.rpm</strong> files into Copr. At this step, Dist Git will be used as a storage only. Direct access to the repositories will come afterwards.</p>\n<h3>New User Interface\xa0 Patternfly</h3>\n<p>Enabling Dist Git required some changes to the user interface as well. We didn’t use any framework, that would help us to easily create new elements in the UI. Instead, we had a custom CSS that received new lines of code with each change. As you can imagine, each change took a bit longer than desired, the CSS became messy, and yes, the interface itself became messy as well. At this point, I decided that we need to do a step forward and we finally agreed to rewrite the user interface to <a href="https://www.patternfly.org/">Patternfly</a>! Yay!</p>\n<h4>The Old Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1-819x1024.png" alt="The old Copr interface" height="750" class="alignleft wp-image-181 size-large" width="600"/></a></p>\n<h4>The New Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1-1024x872.png" alt="The new Copr interface" height="511" class="alignleft wp-image-182 size-large" width="600"/></a></p>\n<h3>We need your feedback!</h3>\n<p>I would like to make Copr as friendly as possible. If you want to help me with that, please provide a feedback as a comment. Do you like it? Do you hate it? Is there anything you miss in the interface? Your feedback is much appreciated!</p></div>', 'title': 'Copr, Dist Git and Patternfly', 'date': <GDateTime at 0x5606cd3f3580>, 'author_homepage': 'http://blog.samalik.com', 'url': 'http://blog.samalik.com/copr-dist-git-and-patternfly/', 'is_read': False, 'author_email': None}
15:25:10 DEBUG tracker.py:285 |||||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16b0c18 (TrackerDBCursor at 0x5606cd747720)>), returned {'fullname': 'jzb', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p><a href="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg"><img src="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg" alt="oscon-logo" height="125" class="alignleft size-full wp-image-191" width="125"/></a>Once again, time for the annual trek to Portland, Oregon for OSCON — perhaps for the last time!</p>\n<p>Next year, OSCON is going to be in Austin, TX — which seems like a bit of a mistake to me. Portland and OSCON go together like milk and cookies.</p>\n<p>If you’re going to be at OSCON, make sure to drop by <a href="http://community.redhat.com/blog/2015/07/open-cloud-day-rolls-into-oscon-2015/" target="_blank">Open Cloud Day on Tuesday</a>, and come by the Red Hat booth to say hello!</p></div>', 'title': 'Headed to OSCON', 'date': <GDateTime at 0x5606cd3f36c0>, 'author_homepage': 'http://dissociatedpress.net', 'url': 'http://dissociatedpress.net/headed-to-oscon/', 'is_read': False, 'author_email': None}
15:25:10 DEBUG tracker.py:285 |||||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16b0c18 (TrackerDBCursor at 0x5606cd747720)>), returned {'fullname': 'Niels de Vos', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://devos.fedorapeople.org/.unlisted/me-head-small.png" alt="" style="float: right;"/>\n <h2 id="release-notes-for-glusterfs-3-5-5"/>Packages for <a href="https://admin.fedoraproject.org/updates/FEDORA-2015-11468/glusterfs-3.5.5-2.fc21">Fedora 21 are available in updates-testing</a>, RPMs and <span style="font-family: &quot;Courier New&quot;,Courier,monospace;">.deb</span>s can be found on the <a href="http://download.gluster.org/pub/gluster/glusterfs/3.5/3.5.5/">main Gluster download site</a>.<br/><br/>This is a bugfix release. The <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.0.md">Release Notes for 3.5.0</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.1.md">3.5.1</a>, <a href="https://draft.blogger.com/null">3.5.2</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.3.md">3.5.3</a> and <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.4.md">3.5.4</a> contain a listing of all the new features that were added and bugs fixed in the GlusterFS 3.5 stable release.<br/> <h3 id="bugs-fixed-">Bugs Fixed:</h3><ul><li><a href="https://bugzilla.redhat.com/1166862">1166862</a>: rmtab file is a bottleneck when lot of clients are accessing a volume through NFS</li><li><a href="https://bugzilla.redhat.com/1217432">1217432</a>: DHT:Quota:- brick process crashed after deleting .glusterfs from backend</li><li><a href="https://bugzilla.redhat.com/1217433">1217433</a>: glusterfsd crashed after directory was removed from the mount point, while self-heal and rebalance were running on the volume</li><li><a href="https://bugzilla.redhat.com/1231641">1231641</a>: cli crashes when listing quota limits with xml output</li></ul><h3 id="known-issues-">Known Issues:</h3><ul><li>The following configuration changes are necessary for \'qemu\' and \'samba vfs plugin\' integration with libgfapi to work seamlessly:<br/> <ol><li><code>gluster volume set &lt;volname&gt; server.allow-insecure on</code></li><li>restarting the volume is necessary<br/> <pre><code> gluster volume stop &lt;volname&gt;<br/> gluster volume start &lt;volname&gt;<br/></code></pre></li><li>Edit <code>/etc/glusterfs/glusterd.vol</code> to contain this line:<br/> <pre><code> option rpc-auth-allow-insecure on<br/></code></pre></li><li>restarting glusterd is necessary<br/> <pre><code> service glusterd restart<br/></code></pre>More details are also documented in the Gluster Wiki on the <a href="http://www.gluster.org/community/documentation/index.php/Libgfapi_with_qemu_libvirt">Libgfapi with qemu libvirt</a> page.<br/> </li></ol></li><li>For Block Device translator based volumes open-behind translator at the client side needs to be disabled.<br/> <pre><code>gluster volume set &lt;volname&gt; performance.open-behind disabled<br/></code></pre></li><li>libgfapi clients calling <code>glfs_fini</code> before a successful <code>glfs_init</code> will cause the client to hang as reported <a href="http://lists.gnu.org/archive/html/gluster-devel/2014-04/msg00179.html">here</a>. The workaround is NOT to call <code>glfs_fini</code> for error cases encountered before a successful <code>glfs_init</code>. This is being tracked in <a href="https://bugzilla.redhat.com/1134050">Bug 1134050</a> for glusterfs-3.5 and <a href="https://bugzilla.redhat.com/1093594">Bug 1093594</a> for mainline.<br/> </li><li>If the <code>/var/run/gluster</code> directory does not exist enabling quota will likely fail (<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1117888">Bug 1117888</a>).<br/> </li></ul></div>', 'title': 'Another stable release, GlusterFS 3.5.5 is ready', 'date': <GDateTime at 0x5606cd3f3380>, 'author_homepage': 'http://blog.nixpanic.net/search/label/Fedora', 'url': 'http://blog.nixpanic.net/2015/07/another-stable-release-glusterfs-355-is.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}
15:25:10 DEBUG tracker.py:285 |||||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16b0c18 (TrackerDBCursor at 0x5606cd747720)>), returned {'fullname': 'Jörg Stephan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <a href="http://sendmespamids.blogspot.com/2015/07/encoded-bot-execution-from-16220914224.html?spref=bl">SendMeSpam: Encoded bot execution from 162.209.14.224 includin...</a>: 2015-07-19 16:28:52 Source IP: 162.209.14.224 Country: US RiskScore: 1 Malware: [] POST //%63%67%69%2d%62%69%6e/%70%68%70?%2d%64+%61%6c%6c%...<img src="http://feeds.feedburner.com/~r/LinuxserverDerRest/~4/kolnxm8xS0Q" alt="" height="1" width="1"/></div>', 'title': 'SendMeSpam: Encoded bot execution from 162.209.14.224 includin...', 'date': <GDateTime at 0x5606cd3f36a0>, 'author_homepage': 'http://amelinux.blogspot.com/', 'url': 'http://feedproxy.google.com/~r/LinuxserverDerRest/~3/kolnxm8xS0Q/sendmespam-encoded-bot-execution-from.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}
15:25:10 DEBUG tracker.py:285 |||||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16b0c18 (TrackerDBCursor at 0x5606cd747720)>), returned {'fullname': 'sonalkr132', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p>Project: <a href="https://github.com/glittergallery/GlitterGallery" target="_blank">GlitterGallery</a></p>\n<p>We had a minor set back with implementation of git protocols. I worked on git https protocol but later I found out that <a href="http://sparkleshare.org" target="_blank">sparkleshare</a>\xa0only supports ssh protocol. Until now we were planning to host on <a href="http://openshift.redhat.com" target="_blank">openshift</a>.\xa0I needed access of ~/.ssh/authorized_keys file for git ssh to work but OS doesn’t give away that access. Time to move to VPS. <a href="https://fedoraproject.org/wiki/User:Kevin">Kevin</a>\xa0got me set up with one and <a href="https://fedoraproject.org/wiki/User:Pingou" target="_blank">Pingou</a>\xa0helped me figure out a few details.</p>\n<p>First I needed to make changes to our web interface so that users can add their public key to their profiles. This would also mean addition of a keys model and generation of fingerprint for keys. Next thing is validation of keys when push or pull is made over ssh. This involves two steps namely, authentication and authorization. OpenSSH server handles the authentication part and for authorization I have set up git shell, which makes an api call to glittergallery to check user access. Besides authorization git shell also limits ssh access to git related commands.</p>\n<p>Git shell I am using is just a fork of <a href="https://github.com/gitlabhq/gitlab-shell" target="_blank">gitlab-shell</a>. I am hoping that I won’t need to make any changes to it, however we won’t be supporting all the features (git-annex and git-lfs) of gitlab-shell yet.</p><br/> <a href="http://feeds.wordpress.com/1.0/gocomments/chasingcrazydreams.wordpress.com/49/" rel="nofollow"><img src="http://feeds.wordpress.com/1.0/comments/chasingcrazydreams.wordpress.com/49/" alt="" border="0"/></a> <img src="https://pixel.wp.com/b.gif?host=chasingcrazydreams.wordpress.com&amp;blog=87948641&amp;post=49&amp;subd=chasingcrazydreams&amp;ref=&amp;feed=1" alt="" height="1" border="0" width="1"/></div>', 'title': 'Git over ssh', 'date': <GDateTime at 0x5606cd3f29a0>, 'author_homepage': 'https://chasingcrazydreams.wordpress.com', 'url': 'https://chasingcrazydreams.wordpress.com/2015/07/19/git-over-ssh/', 'is_read': False, 'author_email': None}
15:25:10 DEBUG tracker.py:285 |||||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16b0c18 (TrackerDBCursor at 0x5606cd747720)>), returned {'fullname': 'Major Hayden', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://major.io/wp-content/uploads/2014/03/cropped-hayden_major_01_bw.jpg" alt="" style="float: right;"/>\n <p><a href="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1.jpg"><img src="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1-300x212.jpg" alt="Thinkpad X1 Carbon 3rd gen" height="212" class="alignright size-medium wp-image-5452" width="300"/></a>My upgrade to Fedora 22 on the ThinkPad X1 Carbon was fairly uneventful and the hiccups were minor. One of the more annoying items that I’ve been struggling with for quite some time is how to boot up with the wireless LAN and Bluetooth disabled by default. Restoring wireless and Bluetooth state between reboots is normally handled quite well in Fedora.</p>\n<p>In Fedora 21, NetworkManager saved my settings between reboots. For example, if I shut down with wifi off and Bluetooth on, the laptop would boot up later with wifi off and Bluetooth on. This wasn’t working well in Fedora 22: both the wifi and Bluetooth were always enabled by default.</p>\n<h3>Digging into rfkill</h3>\n<p>I remembered <a href="https://wireless.wiki.kernel.org/en/users/documentation/rfkill">rfkill</a> and began testing out some commands. It detected that I had disabled both devices via NetworkManager (soft):</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html">$ rfkill list\n0: tpacpi_bluetooth_sw: Bluetooth\n Soft blocked: yes\n Hard blocked: no\n2: phy0: Wireless LAN\n Soft blocked: yes\n Hard blocked: no</pre></td></tr></tbody></table></div>\n\n<p>It looked like systemd has some hooks already configured to manage rfkill via the <a href="http://www.freedesktop.org/software/systemd/man/systemd-rfkill@.service.html">systemd-rfkill</a> service. However, something strange happened when I tried to start the service:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># systemctl start systemd-rfkill@0\nFailed to start systemd-rfkill@0.service: Unit systemd-rfkill@0.service is masked.</pre></td></tr></tbody></table></div>\n\n<p>Well, that’s certainly weird. While looking into why it’s masked, I found an empty file in <code>/etc/systemd</code>:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># ls -al /etc/systemd/system/systemd-rfkill@.service \n-rwxr-xr-x. 1 root root 0 May 11 16:36 /etc/systemd/system/systemd-rfkill@.service</pre></td></tr></tbody></table></div>\n\n<p>I don’t remember making that file. Did something else put it there?</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># rpm -qf /etc/systemd/system/systemd-rfkill@.service\ntlp-0.7-4.fc22.noarch</pre></td></tr></tbody></table></div>\n\n<p>Ah, <a href="http://linrunner.de/en/tlp/tlp.html">tlp</a>!</p>\n<h3>Configuring tlp</h3>\n<p>I looked in tlp’s configuration file in <code>/etc/default/tlp</code> and found a few helpful configuration items:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;"># Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown</span>\n<span style="color: #666666; font-style: italic;"># on system startup: 0=disable, 1=enable.</span>\n<span style="color: #666666; font-style: italic;"># Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below</span>\n<span style="color: #666666; font-style: italic;"># are ignored when this is enabled!</span>\n<span style="color: #007800;">RESTORE_DEVICE_STATE_ON_STARTUP</span>=<span style="color: #000000;">0</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_STARTUP="wifi"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (workaround for devices that are blocking shutdown).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (to prevent other operating systems from missing radios).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_SHUTDOWN="wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on AC: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_AC="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery when not in use (not connected):</span>\n<span style="color: #666666; font-style: italic;"># bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>So tlp’s default configuration doesn’t restore device state <b>and</b> it masked systemd’s rfkill service. I adjusted one line in tlp’s configuration and rebooted:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #007800;">DEVICES_TO_DISABLE_ON_STARTUP</span>=<span style="color: #ff0000;">"bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>After the reboot, both the wifi and Bluetooth functionality were shut off! That’s exactly what I needed.</p>\n<h3>Extra credit</h3>\n<p>Thanks to a coworker, I was able to make a NetworkManager script to automatically shut off the wireless LAN whenever I connected to a network via ethernet. This is typically what I do when coming back from an in-person meeting to my desk (where I have ethernet connectivity).</p>\n<p>If you want the same automation, just drop this script into <code>/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh</code> and make it executable:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>\n<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LC_ALL</span>=C\n\xa0\nenable_disable_wifi <span style="color: #7a0874; font-weight: bold;">(</span><span style="color: #7a0874; font-weight: bold;">)</span>\n<span style="color: #7a0874; font-weight: bold;">{</span>\n <span style="color: #007800;">result</span>=$<span style="color: #7a0874; font-weight: bold;">(</span>nmcli dev <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">"ethernet"</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-w</span> <span style="color: #ff0000;">"connected"</span><span style="color: #7a0874; font-weight: bold;">)</span>\n <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">"<span style="color: #007800;">$result</span>"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n nmcli radio wifi off\n <span style="color: #000000; font-weight: bold;">fi</span>\n<span style="color: #7a0874; font-weight: bold;">}</span>\n\xa0\n<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #ff0000;">"$2"</span> = <span style="color: #ff0000;">"up"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n enable_disable_wifi\n<span style="color: #000000; font-weight: bold;">fi</span></pre></td></tr></tbody></table></div>\n\n<p>Unplug the ethernet connection, start wifi, and then plug the ethernet connection back in. Once NetworkManager fully connects (DHCP lease obtained, connectivity check passes), the wireless LAN should shut off automatically.</p>\n<p>The post <a href="https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/" rel="nofollow">Restoring wireless and Bluetooth state after reboot in Fedora 22</a> appeared first on <a href="https://major.io" rel="nofollow">major.io</a>.</p></div>', 'title': 'Restoring wireless and Bluetooth state after reboot in Fedora 22', 'date': <GDateTime at 0x5606cd3f3240>, 'author_homepage': 'https://major.io', 'url': 'https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/', 'is_read': False, 'author_email': None}
15:25:10 DEBUG tracker.py:285 |||||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16b0c18 (TrackerDBCursor at 0x5606cd747720)>), returned {'fullname': 'This week in Fedora', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <div id="activities" class="section">\n<h2>Activities</h2>\n<table border="1" class="docutils"><colgroup><col width="42%"/><col width="15%"/><col width="42%"/></colgroup><thead valign="bottom"><tr><th class="head">Activities</th>\n<th class="head">Amount</th>\n<th class="head">Diff to previous week</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>503</td>\n<td>-01.95%</td>\n</tr><tr><td>Builds</td>\n<td>16382</td>\n<td>-14.23%</td>\n</tr><tr><td>Copr build completed</td>\n<td>3913</td>\n<td>-07.67%</td>\n</tr><tr><td>Copr build started</td>\n<td>3932</td>\n<td>-09.73%</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>550</td>\n<td>+81.52%</td>\n</tr><tr><td>FAS user created</td>\n<td>112</td>\n<td>+27.27%</td>\n</tr><tr><td>Meeting completed</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>Meeting started</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>New packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Posts on the planet</td>\n<td>67</td>\n<td>+34.00%</td>\n</tr><tr><td>Retired packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Updates to stable</td>\n<td>244</td>\n<td>-33.33%</td>\n</tr><tr><td>Updates to testing</td>\n<td>448</td>\n<td>+00.22%</td>\n</tr></tbody></table></div>\n<div id="top-contributors-of-the-week" class="section">\n<h2>Top contributors of the week</h2>\n<table border="1" class="docutils"><colgroup><col width="31%"/><col width="69%"/></colgroup><thead valign="bottom"><tr><th class="head">Activites</th>\n<th class="head">Contributors</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>kelvar81 (8), binaryop (6), itamarjp (6)</td>\n</tr><tr><td>Builds</td>\n<td>pbrobinson (6237), sharkcz (3578), karsten (2819)</td>\n</tr><tr><td>Copr build completed</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Copr build started</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>jkurik (41), adamwill (33), fedoradummy (28)</td>\n</tr><tr><td>Meeting completed</td>\n<td>nirik (10), dgilmore (8), danofsatx (5)</td>\n</tr><tr><td>Meeting started</td>\n<td>decause (2), dgilmore (2), nirik (2)</td>\n</tr><tr><td>New packages</td>\n<td>\xa0</td>\n</tr><tr><td>Posts on the planet</td>\n<td>adamwill (8), admin (5), johe (3)</td>\n</tr><tr><td>Retired packages</td>\n<td>\xa0</td>\n</tr><tr><td>Updates to stable</td>\n<td>siwinski (45), hguemar (19), remi (18)</td>\n</tr><tr><td>Updates to testing</td>\n<td>remi (36), raveit65 (24), orion (20)</td>\n</tr></tbody></table></div></div>', 'title': 'Activities from Mon, 13 Jul 2015 to Sun, 19 Jul 2015', 'date': <GDateTime at 0x5606cd3f3660>, 'author_homepage': 'http://thisweekinfedora.org', 'url': 'http://thisweekinfedora.org/posts/2015_07_19.html', 'is_read': False, 'author_email': None}
15:25:10 DEBUG tracker.py:285 |||||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16b0c18 (TrackerDBCursor at 0x5606cd747720)>), returned {'fullname': 'dustymabe', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <h1 id="history">History</h1>\n<p>In <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> of this series I discussed why I desired a computer setup where I can do full system snapshots so I could seamlessly roll back at will. I also gave an overview of how I went about setting up a system so it could take advantage of <code>BTRFS</code> and <code>snapper</code> to do full system snapshotting and recovery. In this final post of the series I will give an overview of how to get <code>snapper</code> installed and configured on the system and walk through using it to do a rollback.</p>\n<h1 id="installing-and-configuring-snapper">Installing and Configuring Snapper</h1>\n<p>First things first, as part of this whole setup I want to be able to tell how much space each one of my snapshots are taking up. I covered how to do this in a <a href="http://dustymabe.com/2013/09/22/btrfs-how-big-are-my-snapshots/">previous post</a>, but the way you do it is by enabled <code>quota</code> on the <code>BTRFS</code> filesystem:</p>\n<pre><code>[root@localhost ~]# btrfs quota enable / \n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\n[root@localhost ~]# btrfs qgroup show /\nWARNING: Rescan is running, qgroup data may be incorrect\nqgroupid rfer excl \n-------- ---- ---- \n0/5 975.90MiB 975.90MiB \n0/258 16.00KiB 16.00KiB</code></pre>\n<p>You can see from the output that we currently have two subvolumes. One of them is the <em>root subvolume</em> while the other is a subvolume automatically created by <code>systemd</code> for <code>systemd-nspawn</code> container images.</p>\n<p>Now that we have quota enabled let\'s get <code>snapper</code> installed and configured:</p>\n<pre><code>[root@localhost ~]# dnf install -y snapper\n...\nComplete!\n[root@localhost ~]# snapper --config=root create-config /\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \n[root@localhost ~]# snapper list-configs\nConfig | Subvolume\n-------+----------\nroot | / \n[root@localhost ~]#\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 83 top level 5 path .snapshots</code></pre>\n<p>So we used the <code>snapper</code> command to create a configuration for <code>BTRFS</code> filesystem mounted at <code>/</code>. As part of this process we can see from the <code>btrfs subvolume list /</code> command that <code>snapper</code> also created a <code>.snapshots</code> subvolume. This subvolume will be used to house the <code>COW</code> snapshots that are taken of the system.</p>\n<p>The next thing we want to do is add an entry to <code>fstab</code> to make it so that regardless of what subvolume we are actually booted into we will always be able to view the <code>.snapshots</code> subvolume and all nested subvolumes (snapshots):</p>\n<pre><code>[root@localhost ~]# echo \'/dev/vgroot/lvroot /.snapshots btrfs subvol=.snapshots 0 0\' &gt;&gt; /etc/fstab</code></pre>\n<h1 id="taking-snapshots">Taking Snapshots</h1>\n<p>OK, now that we have snapper installed and the <code>.snapshots</code> subvolume in <code>/etc/fstab</code> we can start creating snapshots:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 5 (FS_TREE)\n[root@localhost ~]# snapper create --description "BigBang"\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang |\n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 90 top level 5 path .snapshots\nID 261 gen 88 top level 260 path .snapshots/1/snapshot\n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/1/snapshot/\nbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var</code></pre>\n<p>We made our first snapshot called <strong>BigBang</strong> and then ran a <code>btrfs subvolume list /</code> to view that a new snapshot was actually created. Notice at the top of the output of the sections that we ran a <code>btrfs subvolume get-default /</code>. This outputs what the currently set <em>default subvolume</em> is for the <code>BTRFS</code> filesystem. Right now we are booted into the <em>root subvolume</em> but that will change as soon as we decide we want to use one of the snapshots for rollback.</p>\n<p>Since we took a snapshot let\'s go ahead and make some changes to the system:</p>\n<pre><code>[root@localhost ~]# dnf install -y htop\n[root@localhost ~]# rpm -q htop\nhtop-1.0.3-4.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# snapper status 1..0 | grep htop\n+..... /usr/bin/htop\n+..... /usr/share/doc/htop\n+..... /usr/share/doc/htop/AUTHORS\n+..... /usr/share/doc/htop/COPYING\n+..... /usr/share/doc/htop/ChangeLog\n+..... /usr/share/doc/htop/README\n+..... /usr/share/man/man1/htop.1.gz\n+..... /usr/share/pixmaps/htop.png\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_data\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_type\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/command_line\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/from_repo\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/installed_by\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/reason\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/releasever</code></pre>\n<p>So from this we installed <code>htop</code> and then compared the current running system (<code>0</code>) with snapshot <code>1</code>.</p>\n<h1 id="rolling-back">Rolling Back</h1>\n<p>Now that we have taken a previous snapshot and have since made a change to the system we can use the <code>snapper rollback</code> functionality to get back to the state the system was in before we made the change. Let\'s do the rollback to get back to the snapshot <code>1</code> <strong>BigBang</strong> state:</p>\n<pre><code>[root@localhost ~]# snapper rollback 1\nCreating read-only snapshot of current system. (Snapshot 2.)\nCreating read-write snapshot of snapshot 1. (Snapshot 3.)\nSetting default subvolume to snapshot 3.\n[root@localhost ~]# reboot</code></pre>\n<p>As part of the rollback process you specify to <code>snapper</code> which snapshot you want to go back to. It then creates a read-only snapshot of the current system (in case you change your mind and want to get back to where you currently are) and then a new read-write subvolume based on the snapshot you specified to go back to. It then sets the <em>default subvolume</em> to be the newly created read-write subvolume it just created. After a reboot you will be booted into the new read-write subvolume and your state should be exactly as it was at the time you made the original snapshot.</p>\n<p>In our case, after reboot we should now be booted into snapshot 3 as indicated by the output of the <code>snapper rollback</code> command above and we should be able to inspect information about all of the snapshots on the system:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 263 gen 104 top level 260 path .snapshots/3/snapshot\n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | | \n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/\n1 2 3\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 100 top level 5 path .snapshots\nID 261 gen 98 top level 260 path .snapshots/1/snapshot\nID 262 gen 97 top level 260 path .snapshots/2/snapshot\nID 263 gen 108 top level 260 path .snapshots/3/snapshot</code></pre>\n<p>And the big test is to see if the change we made to the system was actually reverted:</p>\n<pre><code>[root@localhost ~]# rpm -q htop\npackage htop is not installed</code></pre>\n<p>Bliss!!</p>\n<p>Now in my case I like to have more descriptive notes on my snapshots so I\'ll go back now and give some notes for snapshots 2 and 3:</p>\n<pre><code>[root@localhost ~]# snapper modify --description "installed htop" 2\n[root@localhost ~]# snapper modify --description "rollback to 1 - read/write" 3 \n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+----------------------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | installed htop | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | rollback to 1 - read/write |</code></pre>\n<p>We can also see how much space (shared and exclusive each of the snapshots are taking up:</p>\n<pre><code>[root@localhost ~]# btrfs qgroup show / \nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 2.60MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.08GiB 18.91MiB</code></pre>\n<p>Now that is useful info so you can know how much space you will be recovering when you delete snapshots in the future.</p>\n<h1 id="updating-the-kernel">Updating The Kernel</h1>\n<p>I mentioned in <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> that I had to get a special rebuild of <code>GRUB</code> with some patches from the <code>SUSE</code> guys in order to get booting from the default subvolume to work. This was all needed so that I can update the kernel as normal and have the <code>GRUB</code> files that get used be the ones that are in the actual subvolume I am currently using. So let\'s test it out by doing a full system update (including a kernel update):</p>\n<pre><code>[root@localhost ~]# dnf update -y\n...\nInstall 8 Packages\nUpgrade 173 Packages\n...\nComplete!\n[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# btrfs qgroup show /\nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 11.96MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.19GiB 444.35MiB</code></pre>\n<p>So we did a full system upgrade that upgraded 173 packages and installed a few others. We can see now that the current subvolume (snapshot <code>3</code> with ID <code>263</code>) now has 444MiB of exclusive data. This makes sense since all of the other snapshots were from before the full system update.</p>\n<p>Let\'s create a new snapshot that represents the state of the system right after we did the full system update and then reboot:</p>\n<pre><code>[root@localhost ~]# snapper create --description "full system upgrade"\n[root@localhost ~]# reboot</code></pre>\n<p>After reboot we can now check to see if we have properly booted the recently installed kernel:</p>\n<pre><code>[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# uname -r\n4.0.7-300.fc22.x86_64</code></pre>\n<p>Bliss again. Yay! And I\'m Done.</p>\n<p>Enjoy!</p>\n<p>Dusty</p></div>', 'title': 'Fedora BTRFS+Snapper PART 2: Full System Snapshot/Rollback', 'date': <GDateTime at 0x5606cd3f35a0>, 'author_homepage': 'http://dustymabe.com', 'url': 'http://dustymabe.com/2015/07/19/fedora-btrfssnapper-part-2-full-system-snapshotrollback/', 'is_read': False, 'author_email': None}
15:25:10 DEBUG tracker.py:285 |||||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16b0c18 (TrackerDBCursor at 0x5606cd747720)>), returned {'fullname': 'Jamie Nguyen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://jamielinux.fedorapeople.org/avatar.png" alt="" style="float: right;"/>\n <p><a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> is an Ansible playbook I created to make it easy to\ndeploy Discourse without Docker. It supports several distributions, including\nCentOS, Debian, Fedora and Ubuntu. Testing and feedback are very welcome!</p>\n<p><a href="http://www.discourse.org/" class="reference external">Discourse</a> is an open source discussion forum application. The Discourse team\nonly supports installation via their offical Docker image. This is a sensible\nmove as the production environment can be kept more consistent across all\ninstallations, making it harder for administrators to break their site with a\nconfiguration error.</p>\n<p>However, some people may want to avoid using Docker. Perhaps you already manage\nyour servers with Ansible, or you want more flexibility over your production\nenvironment. Perhaps you need more secure isolation (eg, hardware\nvirtualization) than Docker can provide (as <a href="https://opensource.com/business/14/7/docker-security-selinux" class="reference external">containers do not contain</a>). If so, you\nmight want to give <a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> a try.</p></div>', 'title': 'Easily install Discourse using Ansible', 'date': <GDateTime at 0x5606cd3f32a0>, 'author_homepage': 'https://jamielinux.com/blog/', 'url': 'https://jamielinux.com/blog/easily-install-discourse-using-ansible/', 'is_read': False, 'author_email': None}
15:25:10 DEBUG tracker.py:285 |||||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16b0c18 (TrackerDBCursor at 0x5606cd747720)>), returned {'fullname': 'Daniel.Pocock', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.debian.org/heads/pocock.png" alt="" style="float: right;"/>\n <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><a href="https://fedoraproject.org/wiki/User:Zoltanh721">Zoltan (Zoltanh721)</a> recently <a href="http://wordpress-zoltanh721.rhcloud.com/?p=24">blogged about WebRTC for the Fedora community and Fedora desktop</a>.</p>\n<p><a href="https://fedrtc.org">https://fedrtc.org</a> has been running for a while now and this has given many people a chance to get a taste of regular SIP and WebRTC-based SIP. As suggested in Zoltan\'s blog, it has convenient integration with Fedora SSO and as the <a href="http://danielpocock.com/free-and-open-webrtc-for-the-fedora-community">source code is available</a>, people are welcome to see how it was built and use it for other projects.</p>\n<h3>Issues with Chrome/Chromium on Linux</h3>\n<p>If you tried any of <a href="https://fedrtc.org">FedRTC.org</a>, <a href="https://rtc.debian.org">rtc.debian.org</a> or <a href="https://meet.jit.si">meet.jit.si</a> using Chrome/Chromium on Linux, you may have found that the call appears to be connected but there is no media. This is a <a href="https://code.google.com/p/chromium/issues/detail?id=501318">bug</a> and the Chromium developers are on to it. You can work around this by trying an older version of Chromium (it still works with v37 from Debian wheezy) or Firefox/Iceweasel.</p>\n<h3>WebRTC is not everything</h3>\n<p><a href="http://danielpocock.com/tags/webrtc">WebRTC</a> offers many great possibilities for people to quickly build and deploy RTC services to a large user base, especially when using components like <a href="http://jscommunicator.org">JSCommunicator</a> or <a href="http://drucall.org">the DruCall WebRTC plugin for Drupal</a>.</p>\n<p>However, it is not a silver bullet. For example, there remain concerns about how to receive incoming calls. How do you know which browser tab is ringing when you have many tabs open at once? This may require greater browser/desktop integration and that has security implications for JavaScript. Whether users on battery-powered devices can really leave JavaScript running for extended periods of time waiting for incoming calls is another issue, especially when you consider that many web sites contain some JavaScript that is less than efficient.</p>\n<p>Native applications and mobile apps like <a href="http://lumicall.org">Lumicall</a> continue to offer the most optimized solution for each platform although WebRTC currently offers the most convenient way for people to place a <em>Call me</em> link on their web site or portal.</p>\n<h3>Deploy it yourself</h3>\n<p>The <a href="http://rtcquickstart.org">RTC Quick Start Guide</a> offers step-by-step instructions and a thorough discussion of the architecture for people to start deploying RTC and WebRTC on their own servers using standard packages on many of the most popular Linux distributions, including Debian, Ubuntu, RHEL, CentOS and Fedora.</p>\n</div></div></div></div>', 'title': 'RTC status on Debian, Ubuntu and Fedora', 'date': <GDateTime at 0x5606cd3f3200>, 'author_homepage': 'http://danielpocock.com/tags/fedora', 'url': 'http://danielpocock.com/rtc-status-on-debian-ubuntu-and-fedora-july-2015', 'is_read': False, 'author_email': None}
15:25:10 DEBUG tracker.py:46 ||||||gnomenews.tracker.get_post_sorted_by_date(<Tracker object at 0x7f7fa16a67e0 (gnomenews+tracker+Tracker at 0x5606cd3ec7a0)>, 10, True), returned [{'fullname': 'Adam Šamalík', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://pbs.twimg.com/profile_images/505677536232091648/N1HMnx1h_400x400.jpeg" alt="" style="float: right;"/>\n <p>As in the last year, July, for some reason, happened to be a great time to post some news about our <a href="http://copr.fedoraproject.org">Copr Build Service</a>. At this time, it’s about integrating Copr with:</p>\n<ul>\n<li><a href="http://www.patternfly.org">Patternfly</a> – an open interface project</li>\n<li><a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a remote Git repository designed to hold RPM package sources</li>\n</ul>\n<p><em>If you can’t wait to see it, you can check <a href="http://copr-fe-dev.cloud.fedoraproject.org/">the development server</a> that is hopefully running on <a href="http://copr-fe-dev.cloud.fedoraproject.org/">copr-fe-dev.cloud.fedoraproject.org</a>. But please, remember, it’s a development server – so all the projects built here are a subject of deletion, destruction and all kinds of randomization without notice.</em></p>\n<h3>Dist Git for Copr</h3>\n<p>It all started with a need of <strong>uploading sources</strong> to the Copr itself – as the only way of building your package was to provide a URL pointing to it. That, however, required all users to have their own public file storage.</p>\n<p>We decided to go the Fedora way and use <a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a combination of git repository to store spec files, lookaside cache to store sources, and Gitolite to manage access permissions. Each package will be stored in a repo named as ‘username/project/package’. Each repo will contain branches that represent a target platform. For example: ‘f22′ for Fedora 22, ‘epel7′ for Epel for Centos 7, etc.</p>\n<p><img src="https://github.com/release-engineering/dist-git/raw/master/images/storage.png" alt="" height="1150" class="aligncenter" width="1592"/></p>\n<p>It will be gradually deployed in production. The first step is to <strong>enable users to upload their .src.rpm</strong> files into Copr. At this step, Dist Git will be used as a storage only. Direct access to the repositories will come afterwards.</p>\n<h3>New User Interface\xa0 Patternfly</h3>\n<p>Enabling Dist Git required some changes to the user interface as well. We didn’t use any framework, that would help us to easily create new elements in the UI. Instead, we had a custom CSS that received new lines of code with each change. As you can imagine, each change took a bit longer than desired, the CSS became messy, and yes, the interface itself became messy as well. At this point, I decided that we need to do a step forward and we finally agreed to rewrite the user interface to <a href="https://www.patternfly.org/">Patternfly</a>! Yay!</p>\n<h4>The Old Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1-819x1024.png" alt="The old Copr interface" height="750" class="alignleft wp-image-181 size-large" width="600"/></a></p>\n<h4>The New Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1-1024x872.png" alt="The new Copr interface" height="511" class="alignleft wp-image-182 size-large" width="600"/></a></p>\n<h3>We need your feedback!</h3>\n<p>I would like to make Copr as friendly as possible. If you want to help me with that, please provide a feedback as a comment. Do you like it? Do you hate it? Is there anything you miss in the interface? Your feedback is much appreciated!</p></div>', 'title': 'Copr, Dist Git and Patternfly', 'date': <GDateTime at 0x5606cd3f3580>, 'author_homepage': 'http://blog.samalik.com', 'url': 'http://blog.samalik.com/copr-dist-git-and-patternfly/', 'is_read': False, 'author_email': None}, {'fullname': 'jzb', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p><a href="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg"><img src="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg" alt="oscon-logo" height="125" class="alignleft size-full wp-image-191" width="125"/></a>Once again, time for the annual trek to Portland, Oregon for OSCON — perhaps for the last time!</p>\n<p>Next year, OSCON is going to be in Austin, TX — which seems like a bit of a mistake to me. Portland and OSCON go together like milk and cookies.</p>\n<p>If you’re going to be at OSCON, make sure to drop by <a href="http://community.redhat.com/blog/2015/07/open-cloud-day-rolls-into-oscon-2015/" target="_blank">Open Cloud Day on Tuesday</a>, and come by the Red Hat booth to say hello!</p></div>', 'title': 'Headed to OSCON', 'date': <GDateTime at 0x5606cd3f36c0>, 'author_homepage': 'http://dissociatedpress.net', 'url': 'http://dissociatedpress.net/headed-to-oscon/', 'is_read': False, 'author_email': None}, {'fullname': 'Niels de Vos', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://devos.fedorapeople.org/.unlisted/me-head-small.png" alt="" style="float: right;"/>\n <h2 id="release-notes-for-glusterfs-3-5-5"/>Packages for <a href="https://admin.fedoraproject.org/updates/FEDORA-2015-11468/glusterfs-3.5.5-2.fc21">Fedora 21 are available in updates-testing</a>, RPMs and <span style="font-family: &quot;Courier New&quot;,Courier,monospace;">.deb</span>s can be found on the <a href="http://download.gluster.org/pub/gluster/glusterfs/3.5/3.5.5/">main Gluster download site</a>.<br/><br/>This is a bugfix release. The <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.0.md">Release Notes for 3.5.0</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.1.md">3.5.1</a>, <a href="https://draft.blogger.com/null">3.5.2</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.3.md">3.5.3</a> and <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.4.md">3.5.4</a> contain a listing of all the new features that were added and bugs fixed in the GlusterFS 3.5 stable release.<br/> <h3 id="bugs-fixed-">Bugs Fixed:</h3><ul><li><a href="https://bugzilla.redhat.com/1166862">1166862</a>: rmtab file is a bottleneck when lot of clients are accessing a volume through NFS</li><li><a href="https://bugzilla.redhat.com/1217432">1217432</a>: DHT:Quota:- brick process crashed after deleting .glusterfs from backend</li><li><a href="https://bugzilla.redhat.com/1217433">1217433</a>: glusterfsd crashed after directory was removed from the mount point, while self-heal and rebalance were running on the volume</li><li><a href="https://bugzilla.redhat.com/1231641">1231641</a>: cli crashes when listing quota limits with xml output</li></ul><h3 id="known-issues-">Known Issues:</h3><ul><li>The following configuration changes are necessary for \'qemu\' and \'samba vfs plugin\' integration with libgfapi to work seamlessly:<br/> <ol><li><code>gluster volume set &lt;volname&gt; server.allow-insecure on</code></li><li>restarting the volume is necessary<br/> <pre><code> gluster volume stop &lt;volname&gt;<br/> gluster volume start &lt;volname&gt;<br/></code></pre></li><li>Edit <code>/etc/glusterfs/glusterd.vol</code> to contain this line:<br/> <pre><code> option rpc-auth-allow-insecure on<br/></code></pre></li><li>restarting glusterd is necessary<br/> <pre><code> service glusterd restart<br/></code></pre>More details are also documented in the Gluster Wiki on the <a href="http://www.gluster.org/community/documentation/index.php/Libgfapi_with_qemu_libvirt">Libgfapi with qemu libvirt</a> page.<br/> </li></ol></li><li>For Block Device translator based volumes open-behind translator at the client side needs to be disabled.<br/> <pre><code>gluster volume set &lt;volname&gt; performance.open-behind disabled<br/></code></pre></li><li>libgfapi clients calling <code>glfs_fini</code> before a successful <code>glfs_init</code> will cause the client to hang as reported <a href="http://lists.gnu.org/archive/html/gluster-devel/2014-04/msg00179.html">here</a>. The workaround is NOT to call <code>glfs_fini</code> for error cases encountered before a successful <code>glfs_init</code>. This is being tracked in <a href="https://bugzilla.redhat.com/1134050">Bug 1134050</a> for glusterfs-3.5 and <a href="https://bugzilla.redhat.com/1093594">Bug 1093594</a> for mainline.<br/> </li><li>If the <code>/var/run/gluster</code> directory does not exist enabling quota will likely fail (<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1117888">Bug 1117888</a>).<br/> </li></ul></div>', 'title': 'Another stable release, GlusterFS 3.5.5 is ready', 'date': <GDateTime at 0x5606cd3f3380>, 'author_homepage': 'http://blog.nixpanic.net/search/label/Fedora', 'url': 'http://blog.nixpanic.net/2015/07/another-stable-release-glusterfs-355-is.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}, {'fullname': 'Jörg Stephan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <a href="http://sendmespamids.blogspot.com/2015/07/encoded-bot-execution-from-16220914224.html?spref=bl">SendMeSpam: Encoded bot execution from 162.209.14.224 includin...</a>: 2015-07-19 16:28:52 Source IP: 162.209.14.224 Country: US RiskScore: 1 Malware: [] POST //%63%67%69%2d%62%69%6e/%70%68%70?%2d%64+%61%6c%6c%...<img src="http://feeds.feedburner.com/~r/LinuxserverDerRest/~4/kolnxm8xS0Q" alt="" height="1" width="1"/></div>', 'title': 'SendMeSpam: Encoded bot execution from 162.209.14.224 includin...', 'date': <GDateTime at 0x5606cd3f36a0>, 'author_homepage': 'http://amelinux.blogspot.com/', 'url': 'http://feedproxy.google.com/~r/LinuxserverDerRest/~3/kolnxm8xS0Q/sendmespam-encoded-bot-execution-from.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}, {'fullname': 'sonalkr132', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p>Project: <a href="https://github.com/glittergallery/GlitterGallery" target="_blank">GlitterGallery</a></p>\n<p>We had a minor set back with implementation of git protocols. I worked on git https protocol but later I found out that <a href="http://sparkleshare.org" target="_blank">sparkleshare</a>\xa0only supports ssh protocol. Until now we were planning to host on <a href="http://openshift.redhat.com" target="_blank">openshift</a>.\xa0I needed access of ~/.ssh/authorized_keys file for git ssh to work but OS doesn’t give away that access. Time to move to VPS. <a href="https://fedoraproject.org/wiki/User:Kevin">Kevin</a>\xa0got me set up with one and <a href="https://fedoraproject.org/wiki/User:Pingou" target="_blank">Pingou</a>\xa0helped me figure out a few details.</p>\n<p>First I needed to make changes to our web interface so that users can add their public key to their profiles. This would also mean addition of a keys model and generation of fingerprint for keys. Next thing is validation of keys when push or pull is made over ssh. This involves two steps namely, authentication and authorization. OpenSSH server handles the authentication part and for authorization I have set up git shell, which makes an api call to glittergallery to check user access. Besides authorization git shell also limits ssh access to git related commands.</p>\n<p>Git shell I am using is just a fork of <a href="https://github.com/gitlabhq/gitlab-shell" target="_blank">gitlab-shell</a>. I am hoping that I won’t need to make any changes to it, however we won’t be supporting all the features (git-annex and git-lfs) of gitlab-shell yet.</p><br/> <a href="http://feeds.wordpress.com/1.0/gocomments/chasingcrazydreams.wordpress.com/49/" rel="nofollow"><img src="http://feeds.wordpress.com/1.0/comments/chasingcrazydreams.wordpress.com/49/" alt="" border="0"/></a> <img src="https://pixel.wp.com/b.gif?host=chasingcrazydreams.wordpress.com&amp;blog=87948641&amp;post=49&amp;subd=chasingcrazydreams&amp;ref=&amp;feed=1" alt="" height="1" border="0" width="1"/></div>', 'title': 'Git over ssh', 'date': <GDateTime at 0x5606cd3f29a0>, 'author_homepage': 'https://chasingcrazydreams.wordpress.com', 'url': 'https://chasingcrazydreams.wordpress.com/2015/07/19/git-over-ssh/', 'is_read': False, 'author_email': None}, {'fullname': 'Major Hayden', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://major.io/wp-content/uploads/2014/03/cropped-hayden_major_01_bw.jpg" alt="" style="float: right;"/>\n <p><a href="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1.jpg"><img src="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1-300x212.jpg" alt="Thinkpad X1 Carbon 3rd gen" height="212" class="alignright size-medium wp-image-5452" width="300"/></a>My upgrade to Fedora 22 on the ThinkPad X1 Carbon was fairly uneventful and the hiccups were minor. One of the more annoying items that I’ve been struggling with for quite some time is how to boot up with the wireless LAN and Bluetooth disabled by default. Restoring wireless and Bluetooth state between reboots is normally handled quite well in Fedora.</p>\n<p>In Fedora 21, NetworkManager saved my settings between reboots. For example, if I shut down with wifi off and Bluetooth on, the laptop would boot up later with wifi off and Bluetooth on. This wasn’t working well in Fedora 22: both the wifi and Bluetooth were always enabled by default.</p>\n<h3>Digging into rfkill</h3>\n<p>I remembered <a href="https://wireless.wiki.kernel.org/en/users/documentation/rfkill">rfkill</a> and began testing out some commands. It detected that I had disabled both devices via NetworkManager (soft):</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html">$ rfkill list\n0: tpacpi_bluetooth_sw: Bluetooth\n Soft blocked: yes\n Hard blocked: no\n2: phy0: Wireless LAN\n Soft blocked: yes\n Hard blocked: no</pre></td></tr></tbody></table></div>\n\n<p>It looked like systemd has some hooks already configured to manage rfkill via the <a href="http://www.freedesktop.org/software/systemd/man/systemd-rfkill@.service.html">systemd-rfkill</a> service. However, something strange happened when I tried to start the service:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># systemctl start systemd-rfkill@0\nFailed to start systemd-rfkill@0.service: Unit systemd-rfkill@0.service is masked.</pre></td></tr></tbody></table></div>\n\n<p>Well, that’s certainly weird. While looking into why it’s masked, I found an empty file in <code>/etc/systemd</code>:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># ls -al /etc/systemd/system/systemd-rfkill@.service \n-rwxr-xr-x. 1 root root 0 May 11 16:36 /etc/systemd/system/systemd-rfkill@.service</pre></td></tr></tbody></table></div>\n\n<p>I don’t remember making that file. Did something else put it there?</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># rpm -qf /etc/systemd/system/systemd-rfkill@.service\ntlp-0.7-4.fc22.noarch</pre></td></tr></tbody></table></div>\n\n<p>Ah, <a href="http://linrunner.de/en/tlp/tlp.html">tlp</a>!</p>\n<h3>Configuring tlp</h3>\n<p>I looked in tlp’s configuration file in <code>/etc/default/tlp</code> and found a few helpful configuration items:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;"># Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown</span>\n<span style="color: #666666; font-style: italic;"># on system startup: 0=disable, 1=enable.</span>\n<span style="color: #666666; font-style: italic;"># Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below</span>\n<span style="color: #666666; font-style: italic;"># are ignored when this is enabled!</span>\n<span style="color: #007800;">RESTORE_DEVICE_STATE_ON_STARTUP</span>=<span style="color: #000000;">0</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_STARTUP="wifi"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (workaround for devices that are blocking shutdown).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (to prevent other operating systems from missing radios).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_SHUTDOWN="wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on AC: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_AC="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery when not in use (not connected):</span>\n<span style="color: #666666; font-style: italic;"># bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>So tlp’s default configuration doesn’t restore device state <b>and</b> it masked systemd’s rfkill service. I adjusted one line in tlp’s configuration and rebooted:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #007800;">DEVICES_TO_DISABLE_ON_STARTUP</span>=<span style="color: #ff0000;">"bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>After the reboot, both the wifi and Bluetooth functionality were shut off! That’s exactly what I needed.</p>\n<h3>Extra credit</h3>\n<p>Thanks to a coworker, I was able to make a NetworkManager script to automatically shut off the wireless LAN whenever I connected to a network via ethernet. This is typically what I do when coming back from an in-person meeting to my desk (where I have ethernet connectivity).</p>\n<p>If you want the same automation, just drop this script into <code>/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh</code> and make it executable:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>\n<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LC_ALL</span>=C\n\xa0\nenable_disable_wifi <span style="color: #7a0874; font-weight: bold;">(</span><span style="color: #7a0874; font-weight: bold;">)</span>\n<span style="color: #7a0874; font-weight: bold;">{</span>\n <span style="color: #007800;">result</span>=$<span style="color: #7a0874; font-weight: bold;">(</span>nmcli dev <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">"ethernet"</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-w</span> <span style="color: #ff0000;">"connected"</span><span style="color: #7a0874; font-weight: bold;">)</span>\n <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">"<span style="color: #007800;">$result</span>"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n nmcli radio wifi off\n <span style="color: #000000; font-weight: bold;">fi</span>\n<span style="color: #7a0874; font-weight: bold;">}</span>\n\xa0\n<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #ff0000;">"$2"</span> = <span style="color: #ff0000;">"up"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n enable_disable_wifi\n<span style="color: #000000; font-weight: bold;">fi</span></pre></td></tr></tbody></table></div>\n\n<p>Unplug the ethernet connection, start wifi, and then plug the ethernet connection back in. Once NetworkManager fully connects (DHCP lease obtained, connectivity check passes), the wireless LAN should shut off automatically.</p>\n<p>The post <a href="https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/" rel="nofollow">Restoring wireless and Bluetooth state after reboot in Fedora 22</a> appeared first on <a href="https://major.io" rel="nofollow">major.io</a>.</p></div>', 'title': 'Restoring wireless and Bluetooth state after reboot in Fedora 22', 'date': <GDateTime at 0x5606cd3f3240>, 'author_homepage': 'https://major.io', 'url': 'https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/', 'is_read': False, 'author_email': None}, {'fullname': 'This week in Fedora', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <div id="activities" class="section">\n<h2>Activities</h2>\n<table border="1" class="docutils"><colgroup><col width="42%"/><col width="15%"/><col width="42%"/></colgroup><thead valign="bottom"><tr><th class="head">Activities</th>\n<th class="head">Amount</th>\n<th class="head">Diff to previous week</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>503</td>\n<td>-01.95%</td>\n</tr><tr><td>Builds</td>\n<td>16382</td>\n<td>-14.23%</td>\n</tr><tr><td>Copr build completed</td>\n<td>3913</td>\n<td>-07.67%</td>\n</tr><tr><td>Copr build started</td>\n<td>3932</td>\n<td>-09.73%</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>550</td>\n<td>+81.52%</td>\n</tr><tr><td>FAS user created</td>\n<td>112</td>\n<td>+27.27%</td>\n</tr><tr><td>Meeting completed</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>Meeting started</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>New packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Posts on the planet</td>\n<td>67</td>\n<td>+34.00%</td>\n</tr><tr><td>Retired packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Updates to stable</td>\n<td>244</td>\n<td>-33.33%</td>\n</tr><tr><td>Updates to testing</td>\n<td>448</td>\n<td>+00.22%</td>\n</tr></tbody></table></div>\n<div id="top-contributors-of-the-week" class="section">\n<h2>Top contributors of the week</h2>\n<table border="1" class="docutils"><colgroup><col width="31%"/><col width="69%"/></colgroup><thead valign="bottom"><tr><th class="head">Activites</th>\n<th class="head">Contributors</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>kelvar81 (8), binaryop (6), itamarjp (6)</td>\n</tr><tr><td>Builds</td>\n<td>pbrobinson (6237), sharkcz (3578), karsten (2819)</td>\n</tr><tr><td>Copr build completed</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Copr build started</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>jkurik (41), adamwill (33), fedoradummy (28)</td>\n</tr><tr><td>Meeting completed</td>\n<td>nirik (10), dgilmore (8), danofsatx (5)</td>\n</tr><tr><td>Meeting started</td>\n<td>decause (2), dgilmore (2), nirik (2)</td>\n</tr><tr><td>New packages</td>\n<td>\xa0</td>\n</tr><tr><td>Posts on the planet</td>\n<td>adamwill (8), admin (5), johe (3)</td>\n</tr><tr><td>Retired packages</td>\n<td>\xa0</td>\n</tr><tr><td>Updates to stable</td>\n<td>siwinski (45), hguemar (19), remi (18)</td>\n</tr><tr><td>Updates to testing</td>\n<td>remi (36), raveit65 (24), orion (20)</td>\n</tr></tbody></table></div></div>', 'title': 'Activities from Mon, 13 Jul 2015 to Sun, 19 Jul 2015', 'date': <GDateTime at 0x5606cd3f3660>, 'author_homepage': 'http://thisweekinfedora.org', 'url': 'http://thisweekinfedora.org/posts/2015_07_19.html', 'is_read': False, 'author_email': None}, {'fullname': 'dustymabe', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <h1 id="history">History</h1>\n<p>In <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> of this series I discussed why I desired a computer setup where I can do full system snapshots so I could seamlessly roll back at will. I also gave an overview of how I went about setting up a system so it could take advantage of <code>BTRFS</code> and <code>snapper</code> to do full system snapshotting and recovery. In this final post of the series I will give an overview of how to get <code>snapper</code> installed and configured on the system and walk through using it to do a rollback.</p>\n<h1 id="installing-and-configuring-snapper">Installing and Configuring Snapper</h1>\n<p>First things first, as part of this whole setup I want to be able to tell how much space each one of my snapshots are taking up. I covered how to do this in a <a href="http://dustymabe.com/2013/09/22/btrfs-how-big-are-my-snapshots/">previous post</a>, but the way you do it is by enabled <code>quota</code> on the <code>BTRFS</code> filesystem:</p>\n<pre><code>[root@localhost ~]# btrfs quota enable / \n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\n[root@localhost ~]# btrfs qgroup show /\nWARNING: Rescan is running, qgroup data may be incorrect\nqgroupid rfer excl \n-------- ---- ---- \n0/5 975.90MiB 975.90MiB \n0/258 16.00KiB 16.00KiB</code></pre>\n<p>You can see from the output that we currently have two subvolumes. One of them is the <em>root subvolume</em> while the other is a subvolume automatically created by <code>systemd</code> for <code>systemd-nspawn</code> container images.</p>\n<p>Now that we have quota enabled let\'s get <code>snapper</code> installed and configured:</p>\n<pre><code>[root@localhost ~]# dnf install -y snapper\n...\nComplete!\n[root@localhost ~]# snapper --config=root create-config /\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \n[root@localhost ~]# snapper list-configs\nConfig | Subvolume\n-------+----------\nroot | / \n[root@localhost ~]#\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 83 top level 5 path .snapshots</code></pre>\n<p>So we used the <code>snapper</code> command to create a configuration for <code>BTRFS</code> filesystem mounted at <code>/</code>. As part of this process we can see from the <code>btrfs subvolume list /</code> command that <code>snapper</code> also created a <code>.snapshots</code> subvolume. This subvolume will be used to house the <code>COW</code> snapshots that are taken of the system.</p>\n<p>The next thing we want to do is add an entry to <code>fstab</code> to make it so that regardless of what subvolume we are actually booted into we will always be able to view the <code>.snapshots</code> subvolume and all nested subvolumes (snapshots):</p>\n<pre><code>[root@localhost ~]# echo \'/dev/vgroot/lvroot /.snapshots btrfs subvol=.snapshots 0 0\' &gt;&gt; /etc/fstab</code></pre>\n<h1 id="taking-snapshots">Taking Snapshots</h1>\n<p>OK, now that we have snapper installed and the <code>.snapshots</code> subvolume in <code>/etc/fstab</code> we can start creating snapshots:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 5 (FS_TREE)\n[root@localhost ~]# snapper create --description "BigBang"\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang |\n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 90 top level 5 path .snapshots\nID 261 gen 88 top level 260 path .snapshots/1/snapshot\n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/1/snapshot/\nbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var</code></pre>\n<p>We made our first snapshot called <strong>BigBang</strong> and then ran a <code>btrfs subvolume list /</code> to view that a new snapshot was actually created. Notice at the top of the output of the sections that we ran a <code>btrfs subvolume get-default /</code>. This outputs what the currently set <em>default subvolume</em> is for the <code>BTRFS</code> filesystem. Right now we are booted into the <em>root subvolume</em> but that will change as soon as we decide we want to use one of the snapshots for rollback.</p>\n<p>Since we took a snapshot let\'s go ahead and make some changes to the system:</p>\n<pre><code>[root@localhost ~]# dnf install -y htop\n[root@localhost ~]# rpm -q htop\nhtop-1.0.3-4.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# snapper status 1..0 | grep htop\n+..... /usr/bin/htop\n+..... /usr/share/doc/htop\n+..... /usr/share/doc/htop/AUTHORS\n+..... /usr/share/doc/htop/COPYING\n+..... /usr/share/doc/htop/ChangeLog\n+..... /usr/share/doc/htop/README\n+..... /usr/share/man/man1/htop.1.gz\n+..... /usr/share/pixmaps/htop.png\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_data\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_type\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/command_line\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/from_repo\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/installed_by\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/reason\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/releasever</code></pre>\n<p>So from this we installed <code>htop</code> and then compared the current running system (<code>0</code>) with snapshot <code>1</code>.</p>\n<h1 id="rolling-back">Rolling Back</h1>\n<p>Now that we have taken a previous snapshot and have since made a change to the system we can use the <code>snapper rollback</code> functionality to get back to the state the system was in before we made the change. Let\'s do the rollback to get back to the snapshot <code>1</code> <strong>BigBang</strong> state:</p>\n<pre><code>[root@localhost ~]# snapper rollback 1\nCreating read-only snapshot of current system. (Snapshot 2.)\nCreating read-write snapshot of snapshot 1. (Snapshot 3.)\nSetting default subvolume to snapshot 3.\n[root@localhost ~]# reboot</code></pre>\n<p>As part of the rollback process you specify to <code>snapper</code> which snapshot you want to go back to. It then creates a read-only snapshot of the current system (in case you change your mind and want to get back to where you currently are) and then a new read-write subvolume based on the snapshot you specified to go back to. It then sets the <em>default subvolume</em> to be the newly created read-write subvolume it just created. After a reboot you will be booted into the new read-write subvolume and your state should be exactly as it was at the time you made the original snapshot.</p>\n<p>In our case, after reboot we should now be booted into snapshot 3 as indicated by the output of the <code>snapper rollback</code> command above and we should be able to inspect information about all of the snapshots on the system:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 263 gen 104 top level 260 path .snapshots/3/snapshot\n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | | \n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/\n1 2 3\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 100 top level 5 path .snapshots\nID 261 gen 98 top level 260 path .snapshots/1/snapshot\nID 262 gen 97 top level 260 path .snapshots/2/snapshot\nID 263 gen 108 top level 260 path .snapshots/3/snapshot</code></pre>\n<p>And the big test is to see if the change we made to the system was actually reverted:</p>\n<pre><code>[root@localhost ~]# rpm -q htop\npackage htop is not installed</code></pre>\n<p>Bliss!!</p>\n<p>Now in my case I like to have more descriptive notes on my snapshots so I\'ll go back now and give some notes for snapshots 2 and 3:</p>\n<pre><code>[root@localhost ~]# snapper modify --description "installed htop" 2\n[root@localhost ~]# snapper modify --description "rollback to 1 - read/write" 3 \n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+----------------------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | installed htop | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | rollback to 1 - read/write |</code></pre>\n<p>We can also see how much space (shared and exclusive each of the snapshots are taking up:</p>\n<pre><code>[root@localhost ~]# btrfs qgroup show / \nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 2.60MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.08GiB 18.91MiB</code></pre>\n<p>Now that is useful info so you can know how much space you will be recovering when you delete snapshots in the future.</p>\n<h1 id="updating-the-kernel">Updating The Kernel</h1>\n<p>I mentioned in <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> that I had to get a special rebuild of <code>GRUB</code> with some patches from the <code>SUSE</code> guys in order to get booting from the default subvolume to work. This was all needed so that I can update the kernel as normal and have the <code>GRUB</code> files that get used be the ones that are in the actual subvolume I am currently using. So let\'s test it out by doing a full system update (including a kernel update):</p>\n<pre><code>[root@localhost ~]# dnf update -y\n...\nInstall 8 Packages\nUpgrade 173 Packages\n...\nComplete!\n[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# btrfs qgroup show /\nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 11.96MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.19GiB 444.35MiB</code></pre>\n<p>So we did a full system upgrade that upgraded 173 packages and installed a few others. We can see now that the current subvolume (snapshot <code>3</code> with ID <code>263</code>) now has 444MiB of exclusive data. This makes sense since all of the other snapshots were from before the full system update.</p>\n<p>Let\'s create a new snapshot that represents the state of the system right after we did the full system update and then reboot:</p>\n<pre><code>[root@localhost ~]# snapper create --description "full system upgrade"\n[root@localhost ~]# reboot</code></pre>\n<p>After reboot we can now check to see if we have properly booted the recently installed kernel:</p>\n<pre><code>[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# uname -r\n4.0.7-300.fc22.x86_64</code></pre>\n<p>Bliss again. Yay! And I\'m Done.</p>\n<p>Enjoy!</p>\n<p>Dusty</p></div>', 'title': 'Fedora BTRFS+Snapper PART 2: Full System Snapshot/Rollback', 'date': <GDateTime at 0x5606cd3f35a0>, 'author_homepage': 'http://dustymabe.com', 'url': 'http://dustymabe.com/2015/07/19/fedora-btrfssnapper-part-2-full-system-snapshotrollback/', 'is_read': False, 'author_email': None}, {'fullname': 'Jamie Nguyen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://jamielinux.fedorapeople.org/avatar.png" alt="" style="float: right;"/>\n <p><a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> is an Ansible playbook I created to make it easy to\ndeploy Discourse without Docker. It supports several distributions, including\nCentOS, Debian, Fedora and Ubuntu. Testing and feedback are very welcome!</p>\n<p><a href="http://www.discourse.org/" class="reference external">Discourse</a> is an open source discussion forum application. The Discourse team\nonly supports installation via their offical Docker image. This is a sensible\nmove as the production environment can be kept more consistent across all\ninstallations, making it harder for administrators to break their site with a\nconfiguration error.</p>\n<p>However, some people may want to avoid using Docker. Perhaps you already manage\nyour servers with Ansible, or you want more flexibility over your production\nenvironment. Perhaps you need more secure isolation (eg, hardware\nvirtualization) than Docker can provide (as <a href="https://opensource.com/business/14/7/docker-security-selinux" class="reference external">containers do not contain</a>). If so, you\nmight want to give <a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> a try.</p></div>', 'title': 'Easily install Discourse using Ansible', 'date': <GDateTime at 0x5606cd3f32a0>, 'author_homepage': 'https://jamielinux.com/blog/', 'url': 'https://jamielinux.com/blog/easily-install-discourse-using-ansible/', 'is_read': False, 'author_email': None}, {'fullname': 'Daniel.Pocock', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.debian.org/heads/pocock.png" alt="" style="float: right;"/>\n <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><a href="https://fedoraproject.org/wiki/User:Zoltanh721">Zoltan (Zoltanh721)</a> recently <a href="http://wordpress-zoltanh721.rhcloud.com/?p=24">blogged about WebRTC for the Fedora community and Fedora desktop</a>.</p>\n<p><a href="https://fedrtc.org">https://fedrtc.org</a> has been running for a while now and this has given many people a chance to get a taste of regular SIP and WebRTC-based SIP. As suggested in Zoltan\'s blog, it has convenient integration with Fedora SSO and as the <a href="http://danielpocock.com/free-and-open-webrtc-for-the-fedora-community">source code is available</a>, people are welcome to see how it was built and use it for other projects.</p>\n<h3>Issues with Chrome/Chromium on Linux</h3>\n<p>If you tried any of <a href="https://fedrtc.org">FedRTC.org</a>, <a href="https://rtc.debian.org">rtc.debian.org</a> or <a href="https://meet.jit.si">meet.jit.si</a> using Chrome/Chromium on Linux, you may have found that the call appears to be connected but there is no media. This is a <a href="https://code.google.com/p/chromium/issues/detail?id=501318">bug</a> and the Chromium developers are on to it. You can work around this by trying an older version of Chromium (it still works with v37 from Debian wheezy) or Firefox/Iceweasel.</p>\n<h3>WebRTC is not everything</h3>\n<p><a href="http://danielpocock.com/tags/webrtc">WebRTC</a> offers many great possibilities for people to quickly build and deploy RTC services to a large user base, especially when using components like <a href="http://jscommunicator.org">JSCommunicator</a> or <a href="http://drucall.org">the DruCall WebRTC plugin for Drupal</a>.</p>\n<p>However, it is not a silver bullet. For example, there remain concerns about how to receive incoming calls. How do you know which browser tab is ringing when you have many tabs open at once? This may require greater browser/desktop integration and that has security implications for JavaScript. Whether users on battery-powered devices can really leave JavaScript running for extended periods of time waiting for incoming calls is another issue, especially when you consider that many web sites contain some JavaScript that is less than efficient.</p>\n<p>Native applications and mobile apps like <a href="http://lumicall.org">Lumicall</a> continue to offer the most optimized solution for each platform although WebRTC currently offers the most convenient way for people to place a <em>Call me</em> link on their web site or portal.</p>\n<h3>Deploy it yourself</h3>\n<p>The <a href="http://rtcquickstart.org">RTC Quick Start Guide</a> offers step-by-step instructions and a thorough discussion of the architecture for people to start deploying RTC and WebRTC on their own servers using standard packages on many of the most popular Linux distributions, including Debian, Ubuntu, RHEL, CentOS and Fedora.</p>\n</div></div></div></div>', 'title': 'RTC status on Debian, Ubuntu and Fedora', 'date': <GDateTime at 0x5606cd3f3200>, 'author_homepage': 'http://danielpocock.com/tags/fedora', 'url': 'http://danielpocock.com/rtc-status-on-debian-ubuntu-and-fedora-july-2015', 'is_read': False, 'author_email': None}]
15:25:10 DEBUG post.py:60 ||||||||gnomenews.post.sanitize_author('Adam Šamalík'), returned Adam Šamalík
15:25:10 DEBUG post.py:40 |||||||gnomenews.post.__init__(<Post object at 0x7f7fa16b0c18 (uninitialized at 0x0)>, {'fullname': 'Adam Šamalík', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://pbs.twimg.com/profile_images/505677536232091648/N1HMnx1h_400x400.jpeg" alt="" style="float: right;"/>\n <p>As in the last year, July, for some reason, happened to be a great time to post some news about our <a href="http://copr.fedoraproject.org">Copr Build Service</a>. At this time, it’s about integrating Copr with:</p>\n<ul>\n<li><a href="http://www.patternfly.org">Patternfly</a> – an open interface project</li>\n<li><a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a remote Git repository designed to hold RPM package sources</li>\n</ul>\n<p><em>If you can’t wait to see it, you can check <a href="http://copr-fe-dev.cloud.fedoraproject.org/">the development server</a> that is hopefully running on <a href="http://copr-fe-dev.cloud.fedoraproject.org/">copr-fe-dev.cloud.fedoraproject.org</a>. But please, remember, it’s a development server – so all the projects built here are a subject of deletion, destruction and all kinds of randomization without notice.</em></p>\n<h3>Dist Git for Copr</h3>\n<p>It all started with a need of <strong>uploading sources</strong> to the Copr itself – as the only way of building your package was to provide a URL pointing to it. That, however, required all users to have their own public file storage.</p>\n<p>We decided to go the Fedora way and use <a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a combination of git repository to store spec files, lookaside cache to store sources, and Gitolite to manage access permissions. Each package will be stored in a repo named as ‘username/project/package’. Each repo will contain branches that represent a target platform. For example: ‘f22′ for Fedora 22, ‘epel7′ for Epel for Centos 7, etc.</p>\n<p><img src="https://github.com/release-engineering/dist-git/raw/master/images/storage.png" alt="" height="1150" class="aligncenter" width="1592"/></p>\n<p>It will be gradually deployed in production. The first step is to <strong>enable users to upload their .src.rpm</strong> files into Copr. At this step, Dist Git will be used as a storage only. Direct access to the repositories will come afterwards.</p>\n<h3>New User Interface\xa0 Patternfly</h3>\n<p>Enabling Dist Git required some changes to the user interface as well. We didn’t use any framework, that would help us to easily create new elements in the UI. Instead, we had a custom CSS that received new lines of code with each change. As you can imagine, each change took a bit longer than desired, the CSS became messy, and yes, the interface itself became messy as well. At this point, I decided that we need to do a step forward and we finally agreed to rewrite the user interface to <a href="https://www.patternfly.org/">Patternfly</a>! Yay!</p>\n<h4>The Old Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1-819x1024.png" alt="The old Copr interface" height="750" class="alignleft wp-image-181 size-large" width="600"/></a></p>\n<h4>The New Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1-1024x872.png" alt="The new Copr interface" height="511" class="alignleft wp-image-182 size-large" width="600"/></a></p>\n<h3>We need your feedback!</h3>\n<p>I would like to make Copr as friendly as possible. If you want to help me with that, please provide a feedback as a comment. Do you like it? Do you hate it? Is there anything you miss in the interface? Your feedback is much appreciated!</p></div>', 'title': 'Copr, Dist Git and Patternfly', 'date': <GDateTime at 0x5606cd3f3580>, 'author_homepage': 'http://blog.samalik.com', 'url': 'http://blog.samalik.com/copr-dist-git-and-patternfly/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG view.py:80 ||||||gnomenews.view._add_a_new_preview(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, {'fullname': 'Adam Šamalík', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://pbs.twimg.com/profile_images/505677536232091648/N1HMnx1h_400x400.jpeg" alt="" style="float: right;"/>\n <p>As in the last year, July, for some reason, happened to be a great time to post some news about our <a href="http://copr.fedoraproject.org">Copr Build Service</a>. At this time, it’s about integrating Copr with:</p>\n<ul>\n<li><a href="http://www.patternfly.org">Patternfly</a> – an open interface project</li>\n<li><a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a remote Git repository designed to hold RPM package sources</li>\n</ul>\n<p><em>If you can’t wait to see it, you can check <a href="http://copr-fe-dev.cloud.fedoraproject.org/">the development server</a> that is hopefully running on <a href="http://copr-fe-dev.cloud.fedoraproject.org/">copr-fe-dev.cloud.fedoraproject.org</a>. But please, remember, it’s a development server – so all the projects built here are a subject of deletion, destruction and all kinds of randomization without notice.</em></p>\n<h3>Dist Git for Copr</h3>\n<p>It all started with a need of <strong>uploading sources</strong> to the Copr itself – as the only way of building your package was to provide a URL pointing to it. That, however, required all users to have their own public file storage.</p>\n<p>We decided to go the Fedora way and use <a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a combination of git repository to store spec files, lookaside cache to store sources, and Gitolite to manage access permissions. Each package will be stored in a repo named as ‘username/project/package’. Each repo will contain branches that represent a target platform. For example: ‘f22′ for Fedora 22, ‘epel7′ for Epel for Centos 7, etc.</p>\n<p><img src="https://github.com/release-engineering/dist-git/raw/master/images/storage.png" alt="" height="1150" class="aligncenter" width="1592"/></p>\n<p>It will be gradually deployed in production. The first step is to <strong>enable users to upload their .src.rpm</strong> files into Copr. At this step, Dist Git will be used as a storage only. Direct access to the repositories will come afterwards.</p>\n<h3>New User Interface\xa0 Patternfly</h3>\n<p>Enabling Dist Git required some changes to the user interface as well. We didn’t use any framework, that would help us to easily create new elements in the UI. Instead, we had a custom CSS that received new lines of code with each change. As you can imagine, each change took a bit longer than desired, the CSS became messy, and yes, the interface itself became messy as well. At this point, I decided that we need to do a step forward and we finally agreed to rewrite the user interface to <a href="https://www.patternfly.org/">Patternfly</a>! Yay!</p>\n<h4>The Old Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1-819x1024.png" alt="The old Copr interface" height="750" class="alignleft wp-image-181 size-large" width="600"/></a></p>\n<h4>The New Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1-1024x872.png" alt="The new Copr interface" height="511" class="alignleft wp-image-182 size-large" width="600"/></a></p>\n<h3>We need your feedback!</h3>\n<p>I would like to make Copr as friendly as possible. If you want to help me with that, please provide a feedback as a comment. Do you like it? Do you hate it? Is there anything you miss in the interface? Your feedback is much appreciated!</p></div>', 'title': 'Copr, Dist Git and Patternfly', 'date': <GDateTime at 0x5606cd3f3580>, 'author_homepage': 'http://blog.samalik.com', 'url': 'http://blog.samalik.com/copr-dist-git-and-patternfly/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG post.py:60 ||||||||gnomenews.post.sanitize_author('jzb'), returned jzb
15:25:10 DEBUG post.py:40 |||||||gnomenews.post.__init__(<Post object at 0x7f7fa16bd2d0 (uninitialized at 0x0)>, {'fullname': 'jzb', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p><a href="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg"><img src="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg" alt="oscon-logo" height="125" class="alignleft size-full wp-image-191" width="125"/></a>Once again, time for the annual trek to Portland, Oregon for OSCON — perhaps for the last time!</p>\n<p>Next year, OSCON is going to be in Austin, TX — which seems like a bit of a mistake to me. Portland and OSCON go together like milk and cookies.</p>\n<p>If you’re going to be at OSCON, make sure to drop by <a href="http://community.redhat.com/blog/2015/07/open-cloud-day-rolls-into-oscon-2015/" target="_blank">Open Cloud Day on Tuesday</a>, and come by the Red Hat booth to say hello!</p></div>', 'title': 'Headed to OSCON', 'date': <GDateTime at 0x5606cd3f36c0>, 'author_homepage': 'http://dissociatedpress.net', 'url': 'http://dissociatedpress.net/headed-to-oscon/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG view.py:80 ||||||gnomenews.view._add_a_new_preview(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, {'fullname': 'jzb', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p><a href="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg"><img src="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg" alt="oscon-logo" height="125" class="alignleft size-full wp-image-191" width="125"/></a>Once again, time for the annual trek to Portland, Oregon for OSCON — perhaps for the last time!</p>\n<p>Next year, OSCON is going to be in Austin, TX — which seems like a bit of a mistake to me. Portland and OSCON go together like milk and cookies.</p>\n<p>If you’re going to be at OSCON, make sure to drop by <a href="http://community.redhat.com/blog/2015/07/open-cloud-day-rolls-into-oscon-2015/" target="_blank">Open Cloud Day on Tuesday</a>, and come by the Red Hat booth to say hello!</p></div>', 'title': 'Headed to OSCON', 'date': <GDateTime at 0x5606cd3f36c0>, 'author_homepage': 'http://dissociatedpress.net', 'url': 'http://dissociatedpress.net/headed-to-oscon/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG post.py:60 ||||||||gnomenews.post.sanitize_author('Niels de Vos'), returned Niels de Vos
15:25:10 DEBUG post.py:40 |||||||gnomenews.post.__init__(<Post object at 0x7f7fa16bd318 (uninitialized at 0x0)>, {'fullname': 'Niels de Vos', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://devos.fedorapeople.org/.unlisted/me-head-small.png" alt="" style="float: right;"/>\n <h2 id="release-notes-for-glusterfs-3-5-5"/>Packages for <a href="https://admin.fedoraproject.org/updates/FEDORA-2015-11468/glusterfs-3.5.5-2.fc21">Fedora 21 are available in updates-testing</a>, RPMs and <span style="font-family: &quot;Courier New&quot;,Courier,monospace;">.deb</span>s can be found on the <a href="http://download.gluster.org/pub/gluster/glusterfs/3.5/3.5.5/">main Gluster download site</a>.<br/><br/>This is a bugfix release. The <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.0.md">Release Notes for 3.5.0</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.1.md">3.5.1</a>, <a href="https://draft.blogger.com/null">3.5.2</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.3.md">3.5.3</a> and <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.4.md">3.5.4</a> contain a listing of all the new features that were added and bugs fixed in the GlusterFS 3.5 stable release.<br/> <h3 id="bugs-fixed-">Bugs Fixed:</h3><ul><li><a href="https://bugzilla.redhat.com/1166862">1166862</a>: rmtab file is a bottleneck when lot of clients are accessing a volume through NFS</li><li><a href="https://bugzilla.redhat.com/1217432">1217432</a>: DHT:Quota:- brick process crashed after deleting .glusterfs from backend</li><li><a href="https://bugzilla.redhat.com/1217433">1217433</a>: glusterfsd crashed after directory was removed from the mount point, while self-heal and rebalance were running on the volume</li><li><a href="https://bugzilla.redhat.com/1231641">1231641</a>: cli crashes when listing quota limits with xml output</li></ul><h3 id="known-issues-">Known Issues:</h3><ul><li>The following configuration changes are necessary for \'qemu\' and \'samba vfs plugin\' integration with libgfapi to work seamlessly:<br/> <ol><li><code>gluster volume set &lt;volname&gt; server.allow-insecure on</code></li><li>restarting the volume is necessary<br/> <pre><code> gluster volume stop &lt;volname&gt;<br/> gluster volume start &lt;volname&gt;<br/></code></pre></li><li>Edit <code>/etc/glusterfs/glusterd.vol</code> to contain this line:<br/> <pre><code> option rpc-auth-allow-insecure on<br/></code></pre></li><li>restarting glusterd is necessary<br/> <pre><code> service glusterd restart<br/></code></pre>More details are also documented in the Gluster Wiki on the <a href="http://www.gluster.org/community/documentation/index.php/Libgfapi_with_qemu_libvirt">Libgfapi with qemu libvirt</a> page.<br/> </li></ol></li><li>For Block Device translator based volumes open-behind translator at the client side needs to be disabled.<br/> <pre><code>gluster volume set &lt;volname&gt; performance.open-behind disabled<br/></code></pre></li><li>libgfapi clients calling <code>glfs_fini</code> before a successful <code>glfs_init</code> will cause the client to hang as reported <a href="http://lists.gnu.org/archive/html/gluster-devel/2014-04/msg00179.html">here</a>. The workaround is NOT to call <code>glfs_fini</code> for error cases encountered before a successful <code>glfs_init</code>. This is being tracked in <a href="https://bugzilla.redhat.com/1134050">Bug 1134050</a> for glusterfs-3.5 and <a href="https://bugzilla.redhat.com/1093594">Bug 1093594</a> for mainline.<br/> </li><li>If the <code>/var/run/gluster</code> directory does not exist enabling quota will likely fail (<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1117888">Bug 1117888</a>).<br/> </li></ul></div>', 'title': 'Another stable release, GlusterFS 3.5.5 is ready', 'date': <GDateTime at 0x5606cd3f3380>, 'author_homepage': 'http://blog.nixpanic.net/search/label/Fedora', 'url': 'http://blog.nixpanic.net/2015/07/another-stable-release-glusterfs-355-is.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}), returned None
15:25:10 DEBUG view.py:80 ||||||gnomenews.view._add_a_new_preview(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, {'fullname': 'Niels de Vos', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://devos.fedorapeople.org/.unlisted/me-head-small.png" alt="" style="float: right;"/>\n <h2 id="release-notes-for-glusterfs-3-5-5"/>Packages for <a href="https://admin.fedoraproject.org/updates/FEDORA-2015-11468/glusterfs-3.5.5-2.fc21">Fedora 21 are available in updates-testing</a>, RPMs and <span style="font-family: &quot;Courier New&quot;,Courier,monospace;">.deb</span>s can be found on the <a href="http://download.gluster.org/pub/gluster/glusterfs/3.5/3.5.5/">main Gluster download site</a>.<br/><br/>This is a bugfix release. The <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.0.md">Release Notes for 3.5.0</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.1.md">3.5.1</a>, <a href="https://draft.blogger.com/null">3.5.2</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.3.md">3.5.3</a> and <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.4.md">3.5.4</a> contain a listing of all the new features that were added and bugs fixed in the GlusterFS 3.5 stable release.<br/> <h3 id="bugs-fixed-">Bugs Fixed:</h3><ul><li><a href="https://bugzilla.redhat.com/1166862">1166862</a>: rmtab file is a bottleneck when lot of clients are accessing a volume through NFS</li><li><a href="https://bugzilla.redhat.com/1217432">1217432</a>: DHT:Quota:- brick process crashed after deleting .glusterfs from backend</li><li><a href="https://bugzilla.redhat.com/1217433">1217433</a>: glusterfsd crashed after directory was removed from the mount point, while self-heal and rebalance were running on the volume</li><li><a href="https://bugzilla.redhat.com/1231641">1231641</a>: cli crashes when listing quota limits with xml output</li></ul><h3 id="known-issues-">Known Issues:</h3><ul><li>The following configuration changes are necessary for \'qemu\' and \'samba vfs plugin\' integration with libgfapi to work seamlessly:<br/> <ol><li><code>gluster volume set &lt;volname&gt; server.allow-insecure on</code></li><li>restarting the volume is necessary<br/> <pre><code> gluster volume stop &lt;volname&gt;<br/> gluster volume start &lt;volname&gt;<br/></code></pre></li><li>Edit <code>/etc/glusterfs/glusterd.vol</code> to contain this line:<br/> <pre><code> option rpc-auth-allow-insecure on<br/></code></pre></li><li>restarting glusterd is necessary<br/> <pre><code> service glusterd restart<br/></code></pre>More details are also documented in the Gluster Wiki on the <a href="http://www.gluster.org/community/documentation/index.php/Libgfapi_with_qemu_libvirt">Libgfapi with qemu libvirt</a> page.<br/> </li></ol></li><li>For Block Device translator based volumes open-behind translator at the client side needs to be disabled.<br/> <pre><code>gluster volume set &lt;volname&gt; performance.open-behind disabled<br/></code></pre></li><li>libgfapi clients calling <code>glfs_fini</code> before a successful <code>glfs_init</code> will cause the client to hang as reported <a href="http://lists.gnu.org/archive/html/gluster-devel/2014-04/msg00179.html">here</a>. The workaround is NOT to call <code>glfs_fini</code> for error cases encountered before a successful <code>glfs_init</code>. This is being tracked in <a href="https://bugzilla.redhat.com/1134050">Bug 1134050</a> for glusterfs-3.5 and <a href="https://bugzilla.redhat.com/1093594">Bug 1093594</a> for mainline.<br/> </li><li>If the <code>/var/run/gluster</code> directory does not exist enabling quota will likely fail (<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1117888">Bug 1117888</a>).<br/> </li></ul></div>', 'title': 'Another stable release, GlusterFS 3.5.5 is ready', 'date': <GDateTime at 0x5606cd3f3380>, 'author_homepage': 'http://blog.nixpanic.net/search/label/Fedora', 'url': 'http://blog.nixpanic.net/2015/07/another-stable-release-glusterfs-355-is.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}), returned None
15:25:10 DEBUG post.py:60 ||||||||gnomenews.post.sanitize_author('Jörg Stephan'), returned Jörg Stephan
15:25:10 DEBUG post.py:40 |||||||gnomenews.post.__init__(<Post object at 0x7f7fa16bd360 (uninitialized at 0x0)>, {'fullname': 'Jörg Stephan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <a href="http://sendmespamids.blogspot.com/2015/07/encoded-bot-execution-from-16220914224.html?spref=bl">SendMeSpam: Encoded bot execution from 162.209.14.224 includin...</a>: 2015-07-19 16:28:52 Source IP: 162.209.14.224 Country: US RiskScore: 1 Malware: [] POST //%63%67%69%2d%62%69%6e/%70%68%70?%2d%64+%61%6c%6c%...<img src="http://feeds.feedburner.com/~r/LinuxserverDerRest/~4/kolnxm8xS0Q" alt="" height="1" width="1"/></div>', 'title': 'SendMeSpam: Encoded bot execution from 162.209.14.224 includin...', 'date': <GDateTime at 0x5606cd3f36a0>, 'author_homepage': 'http://amelinux.blogspot.com/', 'url': 'http://feedproxy.google.com/~r/LinuxserverDerRest/~3/kolnxm8xS0Q/sendmespam-encoded-bot-execution-from.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}), returned None
15:25:10 DEBUG view.py:80 ||||||gnomenews.view._add_a_new_preview(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, {'fullname': 'Jörg Stephan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <a href="http://sendmespamids.blogspot.com/2015/07/encoded-bot-execution-from-16220914224.html?spref=bl">SendMeSpam: Encoded bot execution from 162.209.14.224 includin...</a>: 2015-07-19 16:28:52 Source IP: 162.209.14.224 Country: US RiskScore: 1 Malware: [] POST //%63%67%69%2d%62%69%6e/%70%68%70?%2d%64+%61%6c%6c%...<img src="http://feeds.feedburner.com/~r/LinuxserverDerRest/~4/kolnxm8xS0Q" alt="" height="1" width="1"/></div>', 'title': 'SendMeSpam: Encoded bot execution from 162.209.14.224 includin...', 'date': <GDateTime at 0x5606cd3f36a0>, 'author_homepage': 'http://amelinux.blogspot.com/', 'url': 'http://feedproxy.google.com/~r/LinuxserverDerRest/~3/kolnxm8xS0Q/sendmespam-encoded-bot-execution-from.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}), returned None
15:25:10 DEBUG post.py:60 ||||||||gnomenews.post.sanitize_author('sonalkr132'), returned sonalkr132
15:25:10 DEBUG post.py:40 |||||||gnomenews.post.__init__(<Post object at 0x7f7fa16bd3a8 (uninitialized at 0x0)>, {'fullname': 'sonalkr132', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p>Project: <a href="https://github.com/glittergallery/GlitterGallery" target="_blank">GlitterGallery</a></p>\n<p>We had a minor set back with implementation of git protocols. I worked on git https protocol but later I found out that <a href="http://sparkleshare.org" target="_blank">sparkleshare</a>\xa0only supports ssh protocol. Until now we were planning to host on <a href="http://openshift.redhat.com" target="_blank">openshift</a>.\xa0I needed access of ~/.ssh/authorized_keys file for git ssh to work but OS doesn’t give away that access. Time to move to VPS. <a href="https://fedoraproject.org/wiki/User:Kevin">Kevin</a>\xa0got me set up with one and <a href="https://fedoraproject.org/wiki/User:Pingou" target="_blank">Pingou</a>\xa0helped me figure out a few details.</p>\n<p>First I needed to make changes to our web interface so that users can add their public key to their profiles. This would also mean addition of a keys model and generation of fingerprint for keys. Next thing is validation of keys when push or pull is made over ssh. This involves two steps namely, authentication and authorization. OpenSSH server handles the authentication part and for authorization I have set up git shell, which makes an api call to glittergallery to check user access. Besides authorization git shell also limits ssh access to git related commands.</p>\n<p>Git shell I am using is just a fork of <a href="https://github.com/gitlabhq/gitlab-shell" target="_blank">gitlab-shell</a>. I am hoping that I won’t need to make any changes to it, however we won’t be supporting all the features (git-annex and git-lfs) of gitlab-shell yet.</p><br/> <a href="http://feeds.wordpress.com/1.0/gocomments/chasingcrazydreams.wordpress.com/49/" rel="nofollow"><img src="http://feeds.wordpress.com/1.0/comments/chasingcrazydreams.wordpress.com/49/" alt="" border="0"/></a> <img src="https://pixel.wp.com/b.gif?host=chasingcrazydreams.wordpress.com&amp;blog=87948641&amp;post=49&amp;subd=chasingcrazydreams&amp;ref=&amp;feed=1" alt="" height="1" border="0" width="1"/></div>', 'title': 'Git over ssh', 'date': <GDateTime at 0x5606cd3f29a0>, 'author_homepage': 'https://chasingcrazydreams.wordpress.com', 'url': 'https://chasingcrazydreams.wordpress.com/2015/07/19/git-over-ssh/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG view.py:80 ||||||gnomenews.view._add_a_new_preview(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, {'fullname': 'sonalkr132', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p>Project: <a href="https://github.com/glittergallery/GlitterGallery" target="_blank">GlitterGallery</a></p>\n<p>We had a minor set back with implementation of git protocols. I worked on git https protocol but later I found out that <a href="http://sparkleshare.org" target="_blank">sparkleshare</a>\xa0only supports ssh protocol. Until now we were planning to host on <a href="http://openshift.redhat.com" target="_blank">openshift</a>.\xa0I needed access of ~/.ssh/authorized_keys file for git ssh to work but OS doesn’t give away that access. Time to move to VPS. <a href="https://fedoraproject.org/wiki/User:Kevin">Kevin</a>\xa0got me set up with one and <a href="https://fedoraproject.org/wiki/User:Pingou" target="_blank">Pingou</a>\xa0helped me figure out a few details.</p>\n<p>First I needed to make changes to our web interface so that users can add their public key to their profiles. This would also mean addition of a keys model and generation of fingerprint for keys. Next thing is validation of keys when push or pull is made over ssh. This involves two steps namely, authentication and authorization. OpenSSH server handles the authentication part and for authorization I have set up git shell, which makes an api call to glittergallery to check user access. Besides authorization git shell also limits ssh access to git related commands.</p>\n<p>Git shell I am using is just a fork of <a href="https://github.com/gitlabhq/gitlab-shell" target="_blank">gitlab-shell</a>. I am hoping that I won’t need to make any changes to it, however we won’t be supporting all the features (git-annex and git-lfs) of gitlab-shell yet.</p><br/> <a href="http://feeds.wordpress.com/1.0/gocomments/chasingcrazydreams.wordpress.com/49/" rel="nofollow"><img src="http://feeds.wordpress.com/1.0/comments/chasingcrazydreams.wordpress.com/49/" alt="" border="0"/></a> <img src="https://pixel.wp.com/b.gif?host=chasingcrazydreams.wordpress.com&amp;blog=87948641&amp;post=49&amp;subd=chasingcrazydreams&amp;ref=&amp;feed=1" alt="" height="1" border="0" width="1"/></div>', 'title': 'Git over ssh', 'date': <GDateTime at 0x5606cd3f29a0>, 'author_homepage': 'https://chasingcrazydreams.wordpress.com', 'url': 'https://chasingcrazydreams.wordpress.com/2015/07/19/git-over-ssh/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG post.py:60 ||||||||gnomenews.post.sanitize_author('Major Hayden'), returned Major Hayden
15:25:10 DEBUG post.py:40 |||||||gnomenews.post.__init__(<Post object at 0x7f7fa16bd3f0 (uninitialized at 0x0)>, {'fullname': 'Major Hayden', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://major.io/wp-content/uploads/2014/03/cropped-hayden_major_01_bw.jpg" alt="" style="float: right;"/>\n <p><a href="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1.jpg"><img src="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1-300x212.jpg" alt="Thinkpad X1 Carbon 3rd gen" height="212" class="alignright size-medium wp-image-5452" width="300"/></a>My upgrade to Fedora 22 on the ThinkPad X1 Carbon was fairly uneventful and the hiccups were minor. One of the more annoying items that I’ve been struggling with for quite some time is how to boot up with the wireless LAN and Bluetooth disabled by default. Restoring wireless and Bluetooth state between reboots is normally handled quite well in Fedora.</p>\n<p>In Fedora 21, NetworkManager saved my settings between reboots. For example, if I shut down with wifi off and Bluetooth on, the laptop would boot up later with wifi off and Bluetooth on. This wasn’t working well in Fedora 22: both the wifi and Bluetooth were always enabled by default.</p>\n<h3>Digging into rfkill</h3>\n<p>I remembered <a href="https://wireless.wiki.kernel.org/en/users/documentation/rfkill">rfkill</a> and began testing out some commands. It detected that I had disabled both devices via NetworkManager (soft):</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html">$ rfkill list\n0: tpacpi_bluetooth_sw: Bluetooth\n Soft blocked: yes\n Hard blocked: no\n2: phy0: Wireless LAN\n Soft blocked: yes\n Hard blocked: no</pre></td></tr></tbody></table></div>\n\n<p>It looked like systemd has some hooks already configured to manage rfkill via the <a href="http://www.freedesktop.org/software/systemd/man/systemd-rfkill@.service.html">systemd-rfkill</a> service. However, something strange happened when I tried to start the service:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># systemctl start systemd-rfkill@0\nFailed to start systemd-rfkill@0.service: Unit systemd-rfkill@0.service is masked.</pre></td></tr></tbody></table></div>\n\n<p>Well, that’s certainly weird. While looking into why it’s masked, I found an empty file in <code>/etc/systemd</code>:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># ls -al /etc/systemd/system/systemd-rfkill@.service \n-rwxr-xr-x. 1 root root 0 May 11 16:36 /etc/systemd/system/systemd-rfkill@.service</pre></td></tr></tbody></table></div>\n\n<p>I don’t remember making that file. Did something else put it there?</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># rpm -qf /etc/systemd/system/systemd-rfkill@.service\ntlp-0.7-4.fc22.noarch</pre></td></tr></tbody></table></div>\n\n<p>Ah, <a href="http://linrunner.de/en/tlp/tlp.html">tlp</a>!</p>\n<h3>Configuring tlp</h3>\n<p>I looked in tlp’s configuration file in <code>/etc/default/tlp</code> and found a few helpful configuration items:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;"># Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown</span>\n<span style="color: #666666; font-style: italic;"># on system startup: 0=disable, 1=enable.</span>\n<span style="color: #666666; font-style: italic;"># Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below</span>\n<span style="color: #666666; font-style: italic;"># are ignored when this is enabled!</span>\n<span style="color: #007800;">RESTORE_DEVICE_STATE_ON_STARTUP</span>=<span style="color: #000000;">0</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_STARTUP="wifi"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (workaround for devices that are blocking shutdown).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (to prevent other operating systems from missing radios).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_SHUTDOWN="wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on AC: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_AC="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery when not in use (not connected):</span>\n<span style="color: #666666; font-style: italic;"># bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>So tlp’s default configuration doesn’t restore device state <b>and</b> it masked systemd’s rfkill service. I adjusted one line in tlp’s configuration and rebooted:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #007800;">DEVICES_TO_DISABLE_ON_STARTUP</span>=<span style="color: #ff0000;">"bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>After the reboot, both the wifi and Bluetooth functionality were shut off! That’s exactly what I needed.</p>\n<h3>Extra credit</h3>\n<p>Thanks to a coworker, I was able to make a NetworkManager script to automatically shut off the wireless LAN whenever I connected to a network via ethernet. This is typically what I do when coming back from an in-person meeting to my desk (where I have ethernet connectivity).</p>\n<p>If you want the same automation, just drop this script into <code>/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh</code> and make it executable:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>\n<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LC_ALL</span>=C\n\xa0\nenable_disable_wifi <span style="color: #7a0874; font-weight: bold;">(</span><span style="color: #7a0874; font-weight: bold;">)</span>\n<span style="color: #7a0874; font-weight: bold;">{</span>\n <span style="color: #007800;">result</span>=$<span style="color: #7a0874; font-weight: bold;">(</span>nmcli dev <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">"ethernet"</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-w</span> <span style="color: #ff0000;">"connected"</span><span style="color: #7a0874; font-weight: bold;">)</span>\n <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">"<span style="color: #007800;">$result</span>"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n nmcli radio wifi off\n <span style="color: #000000; font-weight: bold;">fi</span>\n<span style="color: #7a0874; font-weight: bold;">}</span>\n\xa0\n<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #ff0000;">"$2"</span> = <span style="color: #ff0000;">"up"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n enable_disable_wifi\n<span style="color: #000000; font-weight: bold;">fi</span></pre></td></tr></tbody></table></div>\n\n<p>Unplug the ethernet connection, start wifi, and then plug the ethernet connection back in. Once NetworkManager fully connects (DHCP lease obtained, connectivity check passes), the wireless LAN should shut off automatically.</p>\n<p>The post <a href="https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/" rel="nofollow">Restoring wireless and Bluetooth state after reboot in Fedora 22</a> appeared first on <a href="https://major.io" rel="nofollow">major.io</a>.</p></div>', 'title': 'Restoring wireless and Bluetooth state after reboot in Fedora 22', 'date': <GDateTime at 0x5606cd3f3240>, 'author_homepage': 'https://major.io', 'url': 'https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG view.py:80 ||||||gnomenews.view._add_a_new_preview(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, {'fullname': 'Major Hayden', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://major.io/wp-content/uploads/2014/03/cropped-hayden_major_01_bw.jpg" alt="" style="float: right;"/>\n <p><a href="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1.jpg"><img src="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1-300x212.jpg" alt="Thinkpad X1 Carbon 3rd gen" height="212" class="alignright size-medium wp-image-5452" width="300"/></a>My upgrade to Fedora 22 on the ThinkPad X1 Carbon was fairly uneventful and the hiccups were minor. One of the more annoying items that I’ve been struggling with for quite some time is how to boot up with the wireless LAN and Bluetooth disabled by default. Restoring wireless and Bluetooth state between reboots is normally handled quite well in Fedora.</p>\n<p>In Fedora 21, NetworkManager saved my settings between reboots. For example, if I shut down with wifi off and Bluetooth on, the laptop would boot up later with wifi off and Bluetooth on. This wasn’t working well in Fedora 22: both the wifi and Bluetooth were always enabled by default.</p>\n<h3>Digging into rfkill</h3>\n<p>I remembered <a href="https://wireless.wiki.kernel.org/en/users/documentation/rfkill">rfkill</a> and began testing out some commands. It detected that I had disabled both devices via NetworkManager (soft):</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html">$ rfkill list\n0: tpacpi_bluetooth_sw: Bluetooth\n Soft blocked: yes\n Hard blocked: no\n2: phy0: Wireless LAN\n Soft blocked: yes\n Hard blocked: no</pre></td></tr></tbody></table></div>\n\n<p>It looked like systemd has some hooks already configured to manage rfkill via the <a href="http://www.freedesktop.org/software/systemd/man/systemd-rfkill@.service.html">systemd-rfkill</a> service. However, something strange happened when I tried to start the service:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># systemctl start systemd-rfkill@0\nFailed to start systemd-rfkill@0.service: Unit systemd-rfkill@0.service is masked.</pre></td></tr></tbody></table></div>\n\n<p>Well, that’s certainly weird. While looking into why it’s masked, I found an empty file in <code>/etc/systemd</code>:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># ls -al /etc/systemd/system/systemd-rfkill@.service \n-rwxr-xr-x. 1 root root 0 May 11 16:36 /etc/systemd/system/systemd-rfkill@.service</pre></td></tr></tbody></table></div>\n\n<p>I don’t remember making that file. Did something else put it there?</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># rpm -qf /etc/systemd/system/systemd-rfkill@.service\ntlp-0.7-4.fc22.noarch</pre></td></tr></tbody></table></div>\n\n<p>Ah, <a href="http://linrunner.de/en/tlp/tlp.html">tlp</a>!</p>\n<h3>Configuring tlp</h3>\n<p>I looked in tlp’s configuration file in <code>/etc/default/tlp</code> and found a few helpful configuration items:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;"># Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown</span>\n<span style="color: #666666; font-style: italic;"># on system startup: 0=disable, 1=enable.</span>\n<span style="color: #666666; font-style: italic;"># Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below</span>\n<span style="color: #666666; font-style: italic;"># are ignored when this is enabled!</span>\n<span style="color: #007800;">RESTORE_DEVICE_STATE_ON_STARTUP</span>=<span style="color: #000000;">0</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_STARTUP="wifi"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (workaround for devices that are blocking shutdown).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (to prevent other operating systems from missing radios).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_SHUTDOWN="wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on AC: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_AC="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery when not in use (not connected):</span>\n<span style="color: #666666; font-style: italic;"># bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>So tlp’s default configuration doesn’t restore device state <b>and</b> it masked systemd’s rfkill service. I adjusted one line in tlp’s configuration and rebooted:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #007800;">DEVICES_TO_DISABLE_ON_STARTUP</span>=<span style="color: #ff0000;">"bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>After the reboot, both the wifi and Bluetooth functionality were shut off! That’s exactly what I needed.</p>\n<h3>Extra credit</h3>\n<p>Thanks to a coworker, I was able to make a NetworkManager script to automatically shut off the wireless LAN whenever I connected to a network via ethernet. This is typically what I do when coming back from an in-person meeting to my desk (where I have ethernet connectivity).</p>\n<p>If you want the same automation, just drop this script into <code>/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh</code> and make it executable:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>\n<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LC_ALL</span>=C\n\xa0\nenable_disable_wifi <span style="color: #7a0874; font-weight: bold;">(</span><span style="color: #7a0874; font-weight: bold;">)</span>\n<span style="color: #7a0874; font-weight: bold;">{</span>\n <span style="color: #007800;">result</span>=$<span style="color: #7a0874; font-weight: bold;">(</span>nmcli dev <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">"ethernet"</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-w</span> <span style="color: #ff0000;">"connected"</span><span style="color: #7a0874; font-weight: bold;">)</span>\n <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">"<span style="color: #007800;">$result</span>"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n nmcli radio wifi off\n <span style="color: #000000; font-weight: bold;">fi</span>\n<span style="color: #7a0874; font-weight: bold;">}</span>\n\xa0\n<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #ff0000;">"$2"</span> = <span style="color: #ff0000;">"up"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n enable_disable_wifi\n<span style="color: #000000; font-weight: bold;">fi</span></pre></td></tr></tbody></table></div>\n\n<p>Unplug the ethernet connection, start wifi, and then plug the ethernet connection back in. Once NetworkManager fully connects (DHCP lease obtained, connectivity check passes), the wireless LAN should shut off automatically.</p>\n<p>The post <a href="https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/" rel="nofollow">Restoring wireless and Bluetooth state after reboot in Fedora 22</a> appeared first on <a href="https://major.io" rel="nofollow">major.io</a>.</p></div>', 'title': 'Restoring wireless and Bluetooth state after reboot in Fedora 22', 'date': <GDateTime at 0x5606cd3f3240>, 'author_homepage': 'https://major.io', 'url': 'https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG post.py:60 ||||||||gnomenews.post.sanitize_author('This week in Fedora'), returned This week in Fedora
15:25:10 DEBUG post.py:40 |||||||gnomenews.post.__init__(<Post object at 0x7f7fa16bd438 (uninitialized at 0x0)>, {'fullname': 'This week in Fedora', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <div id="activities" class="section">\n<h2>Activities</h2>\n<table border="1" class="docutils"><colgroup><col width="42%"/><col width="15%"/><col width="42%"/></colgroup><thead valign="bottom"><tr><th class="head">Activities</th>\n<th class="head">Amount</th>\n<th class="head">Diff to previous week</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>503</td>\n<td>-01.95%</td>\n</tr><tr><td>Builds</td>\n<td>16382</td>\n<td>-14.23%</td>\n</tr><tr><td>Copr build completed</td>\n<td>3913</td>\n<td>-07.67%</td>\n</tr><tr><td>Copr build started</td>\n<td>3932</td>\n<td>-09.73%</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>550</td>\n<td>+81.52%</td>\n</tr><tr><td>FAS user created</td>\n<td>112</td>\n<td>+27.27%</td>\n</tr><tr><td>Meeting completed</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>Meeting started</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>New packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Posts on the planet</td>\n<td>67</td>\n<td>+34.00%</td>\n</tr><tr><td>Retired packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Updates to stable</td>\n<td>244</td>\n<td>-33.33%</td>\n</tr><tr><td>Updates to testing</td>\n<td>448</td>\n<td>+00.22%</td>\n</tr></tbody></table></div>\n<div id="top-contributors-of-the-week" class="section">\n<h2>Top contributors of the week</h2>\n<table border="1" class="docutils"><colgroup><col width="31%"/><col width="69%"/></colgroup><thead valign="bottom"><tr><th class="head">Activites</th>\n<th class="head">Contributors</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>kelvar81 (8), binaryop (6), itamarjp (6)</td>\n</tr><tr><td>Builds</td>\n<td>pbrobinson (6237), sharkcz (3578), karsten (2819)</td>\n</tr><tr><td>Copr build completed</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Copr build started</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>jkurik (41), adamwill (33), fedoradummy (28)</td>\n</tr><tr><td>Meeting completed</td>\n<td>nirik (10), dgilmore (8), danofsatx (5)</td>\n</tr><tr><td>Meeting started</td>\n<td>decause (2), dgilmore (2), nirik (2)</td>\n</tr><tr><td>New packages</td>\n<td>\xa0</td>\n</tr><tr><td>Posts on the planet</td>\n<td>adamwill (8), admin (5), johe (3)</td>\n</tr><tr><td>Retired packages</td>\n<td>\xa0</td>\n</tr><tr><td>Updates to stable</td>\n<td>siwinski (45), hguemar (19), remi (18)</td>\n</tr><tr><td>Updates to testing</td>\n<td>remi (36), raveit65 (24), orion (20)</td>\n</tr></tbody></table></div></div>', 'title': 'Activities from Mon, 13 Jul 2015 to Sun, 19 Jul 2015', 'date': <GDateTime at 0x5606cd3f3660>, 'author_homepage': 'http://thisweekinfedora.org', 'url': 'http://thisweekinfedora.org/posts/2015_07_19.html', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG view.py:80 ||||||gnomenews.view._add_a_new_preview(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, {'fullname': 'This week in Fedora', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <div id="activities" class="section">\n<h2>Activities</h2>\n<table border="1" class="docutils"><colgroup><col width="42%"/><col width="15%"/><col width="42%"/></colgroup><thead valign="bottom"><tr><th class="head">Activities</th>\n<th class="head">Amount</th>\n<th class="head">Diff to previous week</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>503</td>\n<td>-01.95%</td>\n</tr><tr><td>Builds</td>\n<td>16382</td>\n<td>-14.23%</td>\n</tr><tr><td>Copr build completed</td>\n<td>3913</td>\n<td>-07.67%</td>\n</tr><tr><td>Copr build started</td>\n<td>3932</td>\n<td>-09.73%</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>550</td>\n<td>+81.52%</td>\n</tr><tr><td>FAS user created</td>\n<td>112</td>\n<td>+27.27%</td>\n</tr><tr><td>Meeting completed</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>Meeting started</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>New packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Posts on the planet</td>\n<td>67</td>\n<td>+34.00%</td>\n</tr><tr><td>Retired packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Updates to stable</td>\n<td>244</td>\n<td>-33.33%</td>\n</tr><tr><td>Updates to testing</td>\n<td>448</td>\n<td>+00.22%</td>\n</tr></tbody></table></div>\n<div id="top-contributors-of-the-week" class="section">\n<h2>Top contributors of the week</h2>\n<table border="1" class="docutils"><colgroup><col width="31%"/><col width="69%"/></colgroup><thead valign="bottom"><tr><th class="head">Activites</th>\n<th class="head">Contributors</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>kelvar81 (8), binaryop (6), itamarjp (6)</td>\n</tr><tr><td>Builds</td>\n<td>pbrobinson (6237), sharkcz (3578), karsten (2819)</td>\n</tr><tr><td>Copr build completed</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Copr build started</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>jkurik (41), adamwill (33), fedoradummy (28)</td>\n</tr><tr><td>Meeting completed</td>\n<td>nirik (10), dgilmore (8), danofsatx (5)</td>\n</tr><tr><td>Meeting started</td>\n<td>decause (2), dgilmore (2), nirik (2)</td>\n</tr><tr><td>New packages</td>\n<td>\xa0</td>\n</tr><tr><td>Posts on the planet</td>\n<td>adamwill (8), admin (5), johe (3)</td>\n</tr><tr><td>Retired packages</td>\n<td>\xa0</td>\n</tr><tr><td>Updates to stable</td>\n<td>siwinski (45), hguemar (19), remi (18)</td>\n</tr><tr><td>Updates to testing</td>\n<td>remi (36), raveit65 (24), orion (20)</td>\n</tr></tbody></table></div></div>', 'title': 'Activities from Mon, 13 Jul 2015 to Sun, 19 Jul 2015', 'date': <GDateTime at 0x5606cd3f3660>, 'author_homepage': 'http://thisweekinfedora.org', 'url': 'http://thisweekinfedora.org/posts/2015_07_19.html', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG post.py:60 ||||||||gnomenews.post.sanitize_author('dustymabe'), returned dustymabe
15:25:10 DEBUG post.py:40 |||||||gnomenews.post.__init__(<Post object at 0x7f7fa16bd480 (uninitialized at 0x0)>, {'fullname': 'dustymabe', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <h1 id="history">History</h1>\n<p>In <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> of this series I discussed why I desired a computer setup where I can do full system snapshots so I could seamlessly roll back at will. I also gave an overview of how I went about setting up a system so it could take advantage of <code>BTRFS</code> and <code>snapper</code> to do full system snapshotting and recovery. In this final post of the series I will give an overview of how to get <code>snapper</code> installed and configured on the system and walk through using it to do a rollback.</p>\n<h1 id="installing-and-configuring-snapper">Installing and Configuring Snapper</h1>\n<p>First things first, as part of this whole setup I want to be able to tell how much space each one of my snapshots are taking up. I covered how to do this in a <a href="http://dustymabe.com/2013/09/22/btrfs-how-big-are-my-snapshots/">previous post</a>, but the way you do it is by enabled <code>quota</code> on the <code>BTRFS</code> filesystem:</p>\n<pre><code>[root@localhost ~]# btrfs quota enable / \n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\n[root@localhost ~]# btrfs qgroup show /\nWARNING: Rescan is running, qgroup data may be incorrect\nqgroupid rfer excl \n-------- ---- ---- \n0/5 975.90MiB 975.90MiB \n0/258 16.00KiB 16.00KiB</code></pre>\n<p>You can see from the output that we currently have two subvolumes. One of them is the <em>root subvolume</em> while the other is a subvolume automatically created by <code>systemd</code> for <code>systemd-nspawn</code> container images.</p>\n<p>Now that we have quota enabled let\'s get <code>snapper</code> installed and configured:</p>\n<pre><code>[root@localhost ~]# dnf install -y snapper\n...\nComplete!\n[root@localhost ~]# snapper --config=root create-config /\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \n[root@localhost ~]# snapper list-configs\nConfig | Subvolume\n-------+----------\nroot | / \n[root@localhost ~]#\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 83 top level 5 path .snapshots</code></pre>\n<p>So we used the <code>snapper</code> command to create a configuration for <code>BTRFS</code> filesystem mounted at <code>/</code>. As part of this process we can see from the <code>btrfs subvolume list /</code> command that <code>snapper</code> also created a <code>.snapshots</code> subvolume. This subvolume will be used to house the <code>COW</code> snapshots that are taken of the system.</p>\n<p>The next thing we want to do is add an entry to <code>fstab</code> to make it so that regardless of what subvolume we are actually booted into we will always be able to view the <code>.snapshots</code> subvolume and all nested subvolumes (snapshots):</p>\n<pre><code>[root@localhost ~]# echo \'/dev/vgroot/lvroot /.snapshots btrfs subvol=.snapshots 0 0\' &gt;&gt; /etc/fstab</code></pre>\n<h1 id="taking-snapshots">Taking Snapshots</h1>\n<p>OK, now that we have snapper installed and the <code>.snapshots</code> subvolume in <code>/etc/fstab</code> we can start creating snapshots:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 5 (FS_TREE)\n[root@localhost ~]# snapper create --description "BigBang"\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang |\n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 90 top level 5 path .snapshots\nID 261 gen 88 top level 260 path .snapshots/1/snapshot\n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/1/snapshot/\nbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var</code></pre>\n<p>We made our first snapshot called <strong>BigBang</strong> and then ran a <code>btrfs subvolume list /</code> to view that a new snapshot was actually created. Notice at the top of the output of the sections that we ran a <code>btrfs subvolume get-default /</code>. This outputs what the currently set <em>default subvolume</em> is for the <code>BTRFS</code> filesystem. Right now we are booted into the <em>root subvolume</em> but that will change as soon as we decide we want to use one of the snapshots for rollback.</p>\n<p>Since we took a snapshot let\'s go ahead and make some changes to the system:</p>\n<pre><code>[root@localhost ~]# dnf install -y htop\n[root@localhost ~]# rpm -q htop\nhtop-1.0.3-4.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# snapper status 1..0 | grep htop\n+..... /usr/bin/htop\n+..... /usr/share/doc/htop\n+..... /usr/share/doc/htop/AUTHORS\n+..... /usr/share/doc/htop/COPYING\n+..... /usr/share/doc/htop/ChangeLog\n+..... /usr/share/doc/htop/README\n+..... /usr/share/man/man1/htop.1.gz\n+..... /usr/share/pixmaps/htop.png\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_data\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_type\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/command_line\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/from_repo\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/installed_by\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/reason\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/releasever</code></pre>\n<p>So from this we installed <code>htop</code> and then compared the current running system (<code>0</code>) with snapshot <code>1</code>.</p>\n<h1 id="rolling-back">Rolling Back</h1>\n<p>Now that we have taken a previous snapshot and have since made a change to the system we can use the <code>snapper rollback</code> functionality to get back to the state the system was in before we made the change. Let\'s do the rollback to get back to the snapshot <code>1</code> <strong>BigBang</strong> state:</p>\n<pre><code>[root@localhost ~]# snapper rollback 1\nCreating read-only snapshot of current system. (Snapshot 2.)\nCreating read-write snapshot of snapshot 1. (Snapshot 3.)\nSetting default subvolume to snapshot 3.\n[root@localhost ~]# reboot</code></pre>\n<p>As part of the rollback process you specify to <code>snapper</code> which snapshot you want to go back to. It then creates a read-only snapshot of the current system (in case you change your mind and want to get back to where you currently are) and then a new read-write subvolume based on the snapshot you specified to go back to. It then sets the <em>default subvolume</em> to be the newly created read-write subvolume it just created. After a reboot you will be booted into the new read-write subvolume and your state should be exactly as it was at the time you made the original snapshot.</p>\n<p>In our case, after reboot we should now be booted into snapshot 3 as indicated by the output of the <code>snapper rollback</code> command above and we should be able to inspect information about all of the snapshots on the system:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 263 gen 104 top level 260 path .snapshots/3/snapshot\n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | | \n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/\n1 2 3\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 100 top level 5 path .snapshots\nID 261 gen 98 top level 260 path .snapshots/1/snapshot\nID 262 gen 97 top level 260 path .snapshots/2/snapshot\nID 263 gen 108 top level 260 path .snapshots/3/snapshot</code></pre>\n<p>And the big test is to see if the change we made to the system was actually reverted:</p>\n<pre><code>[root@localhost ~]# rpm -q htop\npackage htop is not installed</code></pre>\n<p>Bliss!!</p>\n<p>Now in my case I like to have more descriptive notes on my snapshots so I\'ll go back now and give some notes for snapshots 2 and 3:</p>\n<pre><code>[root@localhost ~]# snapper modify --description "installed htop" 2\n[root@localhost ~]# snapper modify --description "rollback to 1 - read/write" 3 \n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+----------------------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | installed htop | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | rollback to 1 - read/write |</code></pre>\n<p>We can also see how much space (shared and exclusive each of the snapshots are taking up:</p>\n<pre><code>[root@localhost ~]# btrfs qgroup show / \nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 2.60MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.08GiB 18.91MiB</code></pre>\n<p>Now that is useful info so you can know how much space you will be recovering when you delete snapshots in the future.</p>\n<h1 id="updating-the-kernel">Updating The Kernel</h1>\n<p>I mentioned in <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> that I had to get a special rebuild of <code>GRUB</code> with some patches from the <code>SUSE</code> guys in order to get booting from the default subvolume to work. This was all needed so that I can update the kernel as normal and have the <code>GRUB</code> files that get used be the ones that are in the actual subvolume I am currently using. So let\'s test it out by doing a full system update (including a kernel update):</p>\n<pre><code>[root@localhost ~]# dnf update -y\n...\nInstall 8 Packages\nUpgrade 173 Packages\n...\nComplete!\n[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# btrfs qgroup show /\nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 11.96MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.19GiB 444.35MiB</code></pre>\n<p>So we did a full system upgrade that upgraded 173 packages and installed a few others. We can see now that the current subvolume (snapshot <code>3</code> with ID <code>263</code>) now has 444MiB of exclusive data. This makes sense since all of the other snapshots were from before the full system update.</p>\n<p>Let\'s create a new snapshot that represents the state of the system right after we did the full system update and then reboot:</p>\n<pre><code>[root@localhost ~]# snapper create --description "full system upgrade"\n[root@localhost ~]# reboot</code></pre>\n<p>After reboot we can now check to see if we have properly booted the recently installed kernel:</p>\n<pre><code>[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# uname -r\n4.0.7-300.fc22.x86_64</code></pre>\n<p>Bliss again. Yay! And I\'m Done.</p>\n<p>Enjoy!</p>\n<p>Dusty</p></div>', 'title': 'Fedora BTRFS+Snapper PART 2: Full System Snapshot/Rollback', 'date': <GDateTime at 0x5606cd3f35a0>, 'author_homepage': 'http://dustymabe.com', 'url': 'http://dustymabe.com/2015/07/19/fedora-btrfssnapper-part-2-full-system-snapshotrollback/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG view.py:80 ||||||gnomenews.view._add_a_new_preview(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, {'fullname': 'dustymabe', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <h1 id="history">History</h1>\n<p>In <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> of this series I discussed why I desired a computer setup where I can do full system snapshots so I could seamlessly roll back at will. I also gave an overview of how I went about setting up a system so it could take advantage of <code>BTRFS</code> and <code>snapper</code> to do full system snapshotting and recovery. In this final post of the series I will give an overview of how to get <code>snapper</code> installed and configured on the system and walk through using it to do a rollback.</p>\n<h1 id="installing-and-configuring-snapper">Installing and Configuring Snapper</h1>\n<p>First things first, as part of this whole setup I want to be able to tell how much space each one of my snapshots are taking up. I covered how to do this in a <a href="http://dustymabe.com/2013/09/22/btrfs-how-big-are-my-snapshots/">previous post</a>, but the way you do it is by enabled <code>quota</code> on the <code>BTRFS</code> filesystem:</p>\n<pre><code>[root@localhost ~]# btrfs quota enable / \n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\n[root@localhost ~]# btrfs qgroup show /\nWARNING: Rescan is running, qgroup data may be incorrect\nqgroupid rfer excl \n-------- ---- ---- \n0/5 975.90MiB 975.90MiB \n0/258 16.00KiB 16.00KiB</code></pre>\n<p>You can see from the output that we currently have two subvolumes. One of them is the <em>root subvolume</em> while the other is a subvolume automatically created by <code>systemd</code> for <code>systemd-nspawn</code> container images.</p>\n<p>Now that we have quota enabled let\'s get <code>snapper</code> installed and configured:</p>\n<pre><code>[root@localhost ~]# dnf install -y snapper\n...\nComplete!\n[root@localhost ~]# snapper --config=root create-config /\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \n[root@localhost ~]# snapper list-configs\nConfig | Subvolume\n-------+----------\nroot | / \n[root@localhost ~]#\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 83 top level 5 path .snapshots</code></pre>\n<p>So we used the <code>snapper</code> command to create a configuration for <code>BTRFS</code> filesystem mounted at <code>/</code>. As part of this process we can see from the <code>btrfs subvolume list /</code> command that <code>snapper</code> also created a <code>.snapshots</code> subvolume. This subvolume will be used to house the <code>COW</code> snapshots that are taken of the system.</p>\n<p>The next thing we want to do is add an entry to <code>fstab</code> to make it so that regardless of what subvolume we are actually booted into we will always be able to view the <code>.snapshots</code> subvolume and all nested subvolumes (snapshots):</p>\n<pre><code>[root@localhost ~]# echo \'/dev/vgroot/lvroot /.snapshots btrfs subvol=.snapshots 0 0\' &gt;&gt; /etc/fstab</code></pre>\n<h1 id="taking-snapshots">Taking Snapshots</h1>\n<p>OK, now that we have snapper installed and the <code>.snapshots</code> subvolume in <code>/etc/fstab</code> we can start creating snapshots:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 5 (FS_TREE)\n[root@localhost ~]# snapper create --description "BigBang"\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang |\n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 90 top level 5 path .snapshots\nID 261 gen 88 top level 260 path .snapshots/1/snapshot\n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/1/snapshot/\nbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var</code></pre>\n<p>We made our first snapshot called <strong>BigBang</strong> and then ran a <code>btrfs subvolume list /</code> to view that a new snapshot was actually created. Notice at the top of the output of the sections that we ran a <code>btrfs subvolume get-default /</code>. This outputs what the currently set <em>default subvolume</em> is for the <code>BTRFS</code> filesystem. Right now we are booted into the <em>root subvolume</em> but that will change as soon as we decide we want to use one of the snapshots for rollback.</p>\n<p>Since we took a snapshot let\'s go ahead and make some changes to the system:</p>\n<pre><code>[root@localhost ~]# dnf install -y htop\n[root@localhost ~]# rpm -q htop\nhtop-1.0.3-4.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# snapper status 1..0 | grep htop\n+..... /usr/bin/htop\n+..... /usr/share/doc/htop\n+..... /usr/share/doc/htop/AUTHORS\n+..... /usr/share/doc/htop/COPYING\n+..... /usr/share/doc/htop/ChangeLog\n+..... /usr/share/doc/htop/README\n+..... /usr/share/man/man1/htop.1.gz\n+..... /usr/share/pixmaps/htop.png\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_data\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_type\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/command_line\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/from_repo\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/installed_by\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/reason\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/releasever</code></pre>\n<p>So from this we installed <code>htop</code> and then compared the current running system (<code>0</code>) with snapshot <code>1</code>.</p>\n<h1 id="rolling-back">Rolling Back</h1>\n<p>Now that we have taken a previous snapshot and have since made a change to the system we can use the <code>snapper rollback</code> functionality to get back to the state the system was in before we made the change. Let\'s do the rollback to get back to the snapshot <code>1</code> <strong>BigBang</strong> state:</p>\n<pre><code>[root@localhost ~]# snapper rollback 1\nCreating read-only snapshot of current system. (Snapshot 2.)\nCreating read-write snapshot of snapshot 1. (Snapshot 3.)\nSetting default subvolume to snapshot 3.\n[root@localhost ~]# reboot</code></pre>\n<p>As part of the rollback process you specify to <code>snapper</code> which snapshot you want to go back to. It then creates a read-only snapshot of the current system (in case you change your mind and want to get back to where you currently are) and then a new read-write subvolume based on the snapshot you specified to go back to. It then sets the <em>default subvolume</em> to be the newly created read-write subvolume it just created. After a reboot you will be booted into the new read-write subvolume and your state should be exactly as it was at the time you made the original snapshot.</p>\n<p>In our case, after reboot we should now be booted into snapshot 3 as indicated by the output of the <code>snapper rollback</code> command above and we should be able to inspect information about all of the snapshots on the system:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 263 gen 104 top level 260 path .snapshots/3/snapshot\n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | | \n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/\n1 2 3\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 100 top level 5 path .snapshots\nID 261 gen 98 top level 260 path .snapshots/1/snapshot\nID 262 gen 97 top level 260 path .snapshots/2/snapshot\nID 263 gen 108 top level 260 path .snapshots/3/snapshot</code></pre>\n<p>And the big test is to see if the change we made to the system was actually reverted:</p>\n<pre><code>[root@localhost ~]# rpm -q htop\npackage htop is not installed</code></pre>\n<p>Bliss!!</p>\n<p>Now in my case I like to have more descriptive notes on my snapshots so I\'ll go back now and give some notes for snapshots 2 and 3:</p>\n<pre><code>[root@localhost ~]# snapper modify --description "installed htop" 2\n[root@localhost ~]# snapper modify --description "rollback to 1 - read/write" 3 \n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+----------------------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | installed htop | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | rollback to 1 - read/write |</code></pre>\n<p>We can also see how much space (shared and exclusive each of the snapshots are taking up:</p>\n<pre><code>[root@localhost ~]# btrfs qgroup show / \nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 2.60MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.08GiB 18.91MiB</code></pre>\n<p>Now that is useful info so you can know how much space you will be recovering when you delete snapshots in the future.</p>\n<h1 id="updating-the-kernel">Updating The Kernel</h1>\n<p>I mentioned in <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> that I had to get a special rebuild of <code>GRUB</code> with some patches from the <code>SUSE</code> guys in order to get booting from the default subvolume to work. This was all needed so that I can update the kernel as normal and have the <code>GRUB</code> files that get used be the ones that are in the actual subvolume I am currently using. So let\'s test it out by doing a full system update (including a kernel update):</p>\n<pre><code>[root@localhost ~]# dnf update -y\n...\nInstall 8 Packages\nUpgrade 173 Packages\n...\nComplete!\n[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# btrfs qgroup show /\nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 11.96MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.19GiB 444.35MiB</code></pre>\n<p>So we did a full system upgrade that upgraded 173 packages and installed a few others. We can see now that the current subvolume (snapshot <code>3</code> with ID <code>263</code>) now has 444MiB of exclusive data. This makes sense since all of the other snapshots were from before the full system update.</p>\n<p>Let\'s create a new snapshot that represents the state of the system right after we did the full system update and then reboot:</p>\n<pre><code>[root@localhost ~]# snapper create --description "full system upgrade"\n[root@localhost ~]# reboot</code></pre>\n<p>After reboot we can now check to see if we have properly booted the recently installed kernel:</p>\n<pre><code>[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# uname -r\n4.0.7-300.fc22.x86_64</code></pre>\n<p>Bliss again. Yay! And I\'m Done.</p>\n<p>Enjoy!</p>\n<p>Dusty</p></div>', 'title': 'Fedora BTRFS+Snapper PART 2: Full System Snapshot/Rollback', 'date': <GDateTime at 0x5606cd3f35a0>, 'author_homepage': 'http://dustymabe.com', 'url': 'http://dustymabe.com/2015/07/19/fedora-btrfssnapper-part-2-full-system-snapshotrollback/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG post.py:60 ||||||||gnomenews.post.sanitize_author('Jamie Nguyen'), returned Jamie Nguyen
15:25:10 DEBUG post.py:40 |||||||gnomenews.post.__init__(<Post object at 0x7f7fa16bd4c8 (uninitialized at 0x0)>, {'fullname': 'Jamie Nguyen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://jamielinux.fedorapeople.org/avatar.png" alt="" style="float: right;"/>\n <p><a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> is an Ansible playbook I created to make it easy to\ndeploy Discourse without Docker. It supports several distributions, including\nCentOS, Debian, Fedora and Ubuntu. Testing and feedback are very welcome!</p>\n<p><a href="http://www.discourse.org/" class="reference external">Discourse</a> is an open source discussion forum application. The Discourse team\nonly supports installation via their offical Docker image. This is a sensible\nmove as the production environment can be kept more consistent across all\ninstallations, making it harder for administrators to break their site with a\nconfiguration error.</p>\n<p>However, some people may want to avoid using Docker. Perhaps you already manage\nyour servers with Ansible, or you want more flexibility over your production\nenvironment. Perhaps you need more secure isolation (eg, hardware\nvirtualization) than Docker can provide (as <a href="https://opensource.com/business/14/7/docker-security-selinux" class="reference external">containers do not contain</a>). If so, you\nmight want to give <a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> a try.</p></div>', 'title': 'Easily install Discourse using Ansible', 'date': <GDateTime at 0x5606cd3f32a0>, 'author_homepage': 'https://jamielinux.com/blog/', 'url': 'https://jamielinux.com/blog/easily-install-discourse-using-ansible/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG view.py:80 ||||||gnomenews.view._add_a_new_preview(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, {'fullname': 'Jamie Nguyen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://jamielinux.fedorapeople.org/avatar.png" alt="" style="float: right;"/>\n <p><a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> is an Ansible playbook I created to make it easy to\ndeploy Discourse without Docker. It supports several distributions, including\nCentOS, Debian, Fedora and Ubuntu. Testing and feedback are very welcome!</p>\n<p><a href="http://www.discourse.org/" class="reference external">Discourse</a> is an open source discussion forum application. The Discourse team\nonly supports installation via their offical Docker image. This is a sensible\nmove as the production environment can be kept more consistent across all\ninstallations, making it harder for administrators to break their site with a\nconfiguration error.</p>\n<p>However, some people may want to avoid using Docker. Perhaps you already manage\nyour servers with Ansible, or you want more flexibility over your production\nenvironment. Perhaps you need more secure isolation (eg, hardware\nvirtualization) than Docker can provide (as <a href="https://opensource.com/business/14/7/docker-security-selinux" class="reference external">containers do not contain</a>). If so, you\nmight want to give <a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> a try.</p></div>', 'title': 'Easily install Discourse using Ansible', 'date': <GDateTime at 0x5606cd3f32a0>, 'author_homepage': 'https://jamielinux.com/blog/', 'url': 'https://jamielinux.com/blog/easily-install-discourse-using-ansible/', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG post.py:60 ||||||||gnomenews.post.sanitize_author('Daniel.Pocock'), returned Daniel.Pocock
15:25:10 DEBUG post.py:40 |||||||gnomenews.post.__init__(<Post object at 0x7f7fa16bd510 (uninitialized at 0x0)>, {'fullname': 'Daniel.Pocock', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.debian.org/heads/pocock.png" alt="" style="float: right;"/>\n <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><a href="https://fedoraproject.org/wiki/User:Zoltanh721">Zoltan (Zoltanh721)</a> recently <a href="http://wordpress-zoltanh721.rhcloud.com/?p=24">blogged about WebRTC for the Fedora community and Fedora desktop</a>.</p>\n<p><a href="https://fedrtc.org">https://fedrtc.org</a> has been running for a while now and this has given many people a chance to get a taste of regular SIP and WebRTC-based SIP. As suggested in Zoltan\'s blog, it has convenient integration with Fedora SSO and as the <a href="http://danielpocock.com/free-and-open-webrtc-for-the-fedora-community">source code is available</a>, people are welcome to see how it was built and use it for other projects.</p>\n<h3>Issues with Chrome/Chromium on Linux</h3>\n<p>If you tried any of <a href="https://fedrtc.org">FedRTC.org</a>, <a href="https://rtc.debian.org">rtc.debian.org</a> or <a href="https://meet.jit.si">meet.jit.si</a> using Chrome/Chromium on Linux, you may have found that the call appears to be connected but there is no media. This is a <a href="https://code.google.com/p/chromium/issues/detail?id=501318">bug</a> and the Chromium developers are on to it. You can work around this by trying an older version of Chromium (it still works with v37 from Debian wheezy) or Firefox/Iceweasel.</p>\n<h3>WebRTC is not everything</h3>\n<p><a href="http://danielpocock.com/tags/webrtc">WebRTC</a> offers many great possibilities for people to quickly build and deploy RTC services to a large user base, especially when using components like <a href="http://jscommunicator.org">JSCommunicator</a> or <a href="http://drucall.org">the DruCall WebRTC plugin for Drupal</a>.</p>\n<p>However, it is not a silver bullet. For example, there remain concerns about how to receive incoming calls. How do you know which browser tab is ringing when you have many tabs open at once? This may require greater browser/desktop integration and that has security implications for JavaScript. Whether users on battery-powered devices can really leave JavaScript running for extended periods of time waiting for incoming calls is another issue, especially when you consider that many web sites contain some JavaScript that is less than efficient.</p>\n<p>Native applications and mobile apps like <a href="http://lumicall.org">Lumicall</a> continue to offer the most optimized solution for each platform although WebRTC currently offers the most convenient way for people to place a <em>Call me</em> link on their web site or portal.</p>\n<h3>Deploy it yourself</h3>\n<p>The <a href="http://rtcquickstart.org">RTC Quick Start Guide</a> offers step-by-step instructions and a thorough discussion of the architecture for people to start deploying RTC and WebRTC on their own servers using standard packages on many of the most popular Linux distributions, including Debian, Ubuntu, RHEL, CentOS and Fedora.</p>\n</div></div></div></div>', 'title': 'RTC status on Debian, Ubuntu and Fedora', 'date': <GDateTime at 0x5606cd3f3200>, 'author_homepage': 'http://danielpocock.com/tags/fedora', 'url': 'http://danielpocock.com/rtc-status-on-debian-ubuntu-and-fedora-july-2015', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG view.py:80 ||||||gnomenews.view._add_a_new_preview(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, {'fullname': 'Daniel.Pocock', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.debian.org/heads/pocock.png" alt="" style="float: right;"/>\n <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><a href="https://fedoraproject.org/wiki/User:Zoltanh721">Zoltan (Zoltanh721)</a> recently <a href="http://wordpress-zoltanh721.rhcloud.com/?p=24">blogged about WebRTC for the Fedora community and Fedora desktop</a>.</p>\n<p><a href="https://fedrtc.org">https://fedrtc.org</a> has been running for a while now and this has given many people a chance to get a taste of regular SIP and WebRTC-based SIP. As suggested in Zoltan\'s blog, it has convenient integration with Fedora SSO and as the <a href="http://danielpocock.com/free-and-open-webrtc-for-the-fedora-community">source code is available</a>, people are welcome to see how it was built and use it for other projects.</p>\n<h3>Issues with Chrome/Chromium on Linux</h3>\n<p>If you tried any of <a href="https://fedrtc.org">FedRTC.org</a>, <a href="https://rtc.debian.org">rtc.debian.org</a> or <a href="https://meet.jit.si">meet.jit.si</a> using Chrome/Chromium on Linux, you may have found that the call appears to be connected but there is no media. This is a <a href="https://code.google.com/p/chromium/issues/detail?id=501318">bug</a> and the Chromium developers are on to it. You can work around this by trying an older version of Chromium (it still works with v37 from Debian wheezy) or Firefox/Iceweasel.</p>\n<h3>WebRTC is not everything</h3>\n<p><a href="http://danielpocock.com/tags/webrtc">WebRTC</a> offers many great possibilities for people to quickly build and deploy RTC services to a large user base, especially when using components like <a href="http://jscommunicator.org">JSCommunicator</a> or <a href="http://drucall.org">the DruCall WebRTC plugin for Drupal</a>.</p>\n<p>However, it is not a silver bullet. For example, there remain concerns about how to receive incoming calls. How do you know which browser tab is ringing when you have many tabs open at once? This may require greater browser/desktop integration and that has security implications for JavaScript. Whether users on battery-powered devices can really leave JavaScript running for extended periods of time waiting for incoming calls is another issue, especially when you consider that many web sites contain some JavaScript that is less than efficient.</p>\n<p>Native applications and mobile apps like <a href="http://lumicall.org">Lumicall</a> continue to offer the most optimized solution for each platform although WebRTC currently offers the most convenient way for people to place a <em>Call me</em> link on their web site or portal.</p>\n<h3>Deploy it yourself</h3>\n<p>The <a href="http://rtcquickstart.org">RTC Quick Start Guide</a> offers step-by-step instructions and a thorough discussion of the architecture for people to start deploying RTC and WebRTC on their own servers using standard packages on many of the most popular Linux distributions, including Debian, Ubuntu, RHEL, CentOS and Fedora.</p>\n</div></div></div></div>', 'title': 'RTC status on Debian, Ubuntu and Fedora', 'date': <GDateTime at 0x5606cd3f3200>, 'author_homepage': 'http://danielpocock.com/tags/fedora', 'url': 'http://danielpocock.com/rtc-status-on-debian-ubuntu-and-fedora-july-2015', 'is_read': False, 'author_email': None}), returned None
15:25:10 DEBUG view.py:128 |||||gnomenews.view.update_new_items(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>), returned None
15:25:10 DEBUG view.py:245 ||||gnomenews.view.update(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>), returned None
15:25:10 DEBUG window.py:102 |||gnomenews.window.view_changed(<Window object at 0x7f7fa16a1dc8 (gnomenews+window+Window at 0x5606cd512270)>, <Stack object at 0x7f7fa16adf78 (GtkStack at 0x5606cd6d06d0)>, <GParamObject 'visible-child'>), returned None
15:25:10 DEBUG view.py:32 |||gnomenews.view.__init__(<SearchView object at 0x7f7fa16bd558 (uninitialized at 0x0)>, <Tracker object at 0x7f7fa16a67e0 (gnomenews+tracker+Tracker at 0x5606cd3ec7a0)>, 'search'), returned None
15:25:10 DEBUG toolbar.py:72 |||gnomenews.toolbar.set_stack(<Toolbar object at 0x7f7fa16ad828 (gnomenews+toolbar+Toolbar at 0x5606cd3edf80)>, <Stack object at 0x7f7fa16adf78 (GtkStack at 0x5606cd6d06d0)>), returned None
15:25:10 DEBUG window.py:108 ||gnomenews.window._add_views(<Window object at 0x7f7fa16a1dc8 (gnomenews+window+Window at 0x5606cd512270)>), returned None
15:25:10 DEBUG window.py:81 |gnomenews.window._setup_view(<Window object at 0x7f7fa16a1dc8 (gnomenews+window+Window at 0x5606cd512270)>), returned None
15:25:10 DEBUG window.py:31 gnomenews.window.__init__(<Window object at 0x7f7fa16a1dc8 (uninitialized at 0x0)>, <Application object at 0x7f7fa1698ea0 (gnomenews+application+Application at 0x5606cd2a62a0)>), returned None
15:25:10 DEBUG view.py:89 |gnomenews.view._insert_post(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, <Post object at 0x7f7fa16b0c18 (gnomenews+post+Post at 0x5606cd3f32c0)>, <Post object at 0x7f7fa16b0c18 (gnomenews+post+Post at 0x5606cd3f32c0)>), returned None
15:25:10 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16b0c18 (gnomenews+post+Post at 0x5606cd3f32c0)>), returned None
15:25:10 DEBUG view.py:89 |gnomenews.view._insert_post(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, <Post object at 0x7f7fa16bd2d0 (gnomenews+post+Post at 0x5606cd3f3720)>, <Post object at 0x7f7fa16bd2d0 (gnomenews+post+Post at 0x5606cd3f3720)>), returned None
15:25:10 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bd2d0 (gnomenews+post+Post at 0x5606cd3f3720)>), returned None
15:25:10 DEBUG view.py:89 |gnomenews.view._insert_post(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, <Post object at 0x7f7fa16bd318 (gnomenews+post+Post at 0x5606cd3f37a0)>, <Post object at 0x7f7fa16bd318 (gnomenews+post+Post at 0x5606cd3f37a0)>), returned None
15:25:10 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bd318 (gnomenews+post+Post at 0x5606cd3f37a0)>), returned None
15:25:10 DEBUG view.py:89 |gnomenews.view._insert_post(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, <Post object at 0x7f7fa16bd360 (gnomenews+post+Post at 0x5606cd3f3680)>, <Post object at 0x7f7fa16bd360 (gnomenews+post+Post at 0x5606cd3f3680)>), returned None
15:25:10 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bd360 (gnomenews+post+Post at 0x5606cd3f3680)>), returned None
15:25:10 DEBUG view.py:89 |gnomenews.view._insert_post(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, <Post object at 0x7f7fa16bd3a8 (gnomenews+post+Post at 0x5606cd3f3440)>, <Post object at 0x7f7fa16bd3a8 (gnomenews+post+Post at 0x5606cd3f3440)>), returned None
15:25:10 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bd3a8 (gnomenews+post+Post at 0x5606cd3f3440)>), returned None
15:25:10 DEBUG view.py:89 |gnomenews.view._insert_post(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, <Post object at 0x7f7fa16bd3f0 (gnomenews+post+Post at 0x5606cd3f3600)>, <Post object at 0x7f7fa16bd3f0 (gnomenews+post+Post at 0x5606cd3f3600)>), returned None
15:25:10 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bd3f0 (gnomenews+post+Post at 0x5606cd3f3600)>), returned None
15:25:10 DEBUG view.py:89 |gnomenews.view._insert_post(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, <Post object at 0x7f7fa16bd438 (gnomenews+post+Post at 0x5606cd3f3400)>, <Post object at 0x7f7fa16bd438 (gnomenews+post+Post at 0x5606cd3f3400)>), returned None
15:25:10 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bd438 (gnomenews+post+Post at 0x5606cd3f3400)>), returned None
15:25:10 DEBUG view.py:89 |gnomenews.view._insert_post(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, <Post object at 0x7f7fa16bd480 (gnomenews+post+Post at 0x5606cd3f3800)>, <Post object at 0x7f7fa16bd480 (gnomenews+post+Post at 0x5606cd3f3800)>), returned None
15:25:10 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bd480 (gnomenews+post+Post at 0x5606cd3f3800)>), returned None
15:25:10 DEBUG view.py:89 |gnomenews.view._insert_post(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, <Post object at 0x7f7fa16bd4c8 (gnomenews+post+Post at 0x5606cd3f38c0)>, <Post object at 0x7f7fa16bd4c8 (gnomenews+post+Post at 0x5606cd3f38c0)>), returned None
15:25:10 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bd4c8 (gnomenews+post+Post at 0x5606cd3f38c0)>), returned None
15:25:10 DEBUG view.py:89 |gnomenews.view._insert_post(<NewView object at 0x7f7fa16b4ee8 (gnomenews+view+NewView at 0x5606cd6d0890)>, <Post object at 0x7f7fa16bd510 (gnomenews+post+Post at 0x5606cd3f3980)>, <Post object at 0x7f7fa16bd510 (gnomenews+post+Post at 0x5606cd3f3980)>), returned None
15:25:10 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bd510 (gnomenews+post+Post at 0x5606cd3f3980)>), returned None
15:25:13 DEBUG tracker.py:285 ||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdaf8 (TrackerDBCursor at 0x7f7f9400b910)>), returned {'url': 'https://planet.fedoraproject.org/atom.xml', 'title': 'Fedora People'}
15:25:13 DEBUG tracker.py:285 ||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdaf8 (TrackerDBCursor at 0x7f7f9400b910)>), returned {'url': 'https://planet.gnome.org/atom.xml', 'title': 'Planet GNOME'}
15:25:13 DEBUG tracker.py:201 |||gnomenews.tracker.get_channels(<Tracker object at 0x7f7fa16a67e0 (gnomenews+tracker+Tracker at 0x5606cd3ec7a0)>), returned [{'url': 'https://planet.fedoraproject.org/atom.xml', 'title': 'Fedora People'}, {'url': 'https://planet.gnome.org/atom.xml', 'title': 'Planet GNOME'}]
15:25:13 INFO Adding channel https://planet.fedoraproject.org/atom.xml
15:25:13 DEBUG
SELECT
nie:url(?msg) AS url
nie:title(?msg) AS title
nco:fullname(?creator) AS fullname
nie:url(?website) AS author_homepage
nco:emailAddress(?email) AS author_email
nie:contentCreated(?msg) AS date
nmo:htmlMessageContent(?msg) AS content
nmo:isRead(?msg) AS is_read
{ ?msg a mfo:FeedMessage;
nmo:communicationChannel ?chan;
nco:creator ?creator
{ ?chan nie:url "https://planet.fedoraproject.org/atom.xml" }.
OPTIONAL { ?creator nco:hasEmailAddress ?email } .
OPTIONAL { ?creator nco:websiteUrl ?website }
}
ORDER BY DESC (nie:contentCreated(?msg))
LIMIT 10
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdb40 (TrackerDBCursor at 0x5606cd7b8ad0)>), returned {'fullname': 'Adam Šamalík', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://pbs.twimg.com/profile_images/505677536232091648/N1HMnx1h_400x400.jpeg" alt="" style="float: right;"/>\n <p>As in the last year, July, for some reason, happened to be a great time to post some news about our <a href="http://copr.fedoraproject.org">Copr Build Service</a>. At this time, it’s about integrating Copr with:</p>\n<ul>\n<li><a href="http://www.patternfly.org">Patternfly</a> – an open interface project</li>\n<li><a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a remote Git repository designed to hold RPM package sources</li>\n</ul>\n<p><em>If you can’t wait to see it, you can check <a href="http://copr-fe-dev.cloud.fedoraproject.org/">the development server</a> that is hopefully running on <a href="http://copr-fe-dev.cloud.fedoraproject.org/">copr-fe-dev.cloud.fedoraproject.org</a>. But please, remember, it’s a development server – so all the projects built here are a subject of deletion, destruction and all kinds of randomization without notice.</em></p>\n<h3>Dist Git for Copr</h3>\n<p>It all started with a need of <strong>uploading sources</strong> to the Copr itself – as the only way of building your package was to provide a URL pointing to it. That, however, required all users to have their own public file storage.</p>\n<p>We decided to go the Fedora way and use <a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a combination of git repository to store spec files, lookaside cache to store sources, and Gitolite to manage access permissions. Each package will be stored in a repo named as ‘username/project/package’. Each repo will contain branches that represent a target platform. For example: ‘f22′ for Fedora 22, ‘epel7′ for Epel for Centos 7, etc.</p>\n<p><img src="https://github.com/release-engineering/dist-git/raw/master/images/storage.png" alt="" height="1150" class="aligncenter" width="1592"/></p>\n<p>It will be gradually deployed in production. The first step is to <strong>enable users to upload their .src.rpm</strong> files into Copr. At this step, Dist Git will be used as a storage only. Direct access to the repositories will come afterwards.</p>\n<h3>New User Interface\xa0 Patternfly</h3>\n<p>Enabling Dist Git required some changes to the user interface as well. We didn’t use any framework, that would help us to easily create new elements in the UI. Instead, we had a custom CSS that received new lines of code with each change. As you can imagine, each change took a bit longer than desired, the CSS became messy, and yes, the interface itself became messy as well. At this point, I decided that we need to do a step forward and we finally agreed to rewrite the user interface to <a href="https://www.patternfly.org/">Patternfly</a>! Yay!</p>\n<h4>The Old Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1-819x1024.png" alt="The old Copr interface" height="750" class="alignleft wp-image-181 size-large" width="600"/></a></p>\n<h4>The New Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1-1024x872.png" alt="The new Copr interface" height="511" class="alignleft wp-image-182 size-large" width="600"/></a></p>\n<h3>We need your feedback!</h3>\n<p>I would like to make Copr as friendly as possible. If you want to help me with that, please provide a feedback as a comment. Do you like it? Do you hate it? Is there anything you miss in the interface? Your feedback is much appreciated!</p></div>', 'title': 'Copr, Dist Git and Patternfly', 'date': <GDateTime at 0x5606cd417ec0>, 'author_homepage': 'http://blog.samalik.com', 'url': 'http://blog.samalik.com/copr-dist-git-and-patternfly/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdb40 (TrackerDBCursor at 0x5606cd7b8ad0)>), returned {'fullname': 'jzb', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p><a href="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg"><img src="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg" alt="oscon-logo" height="125" class="alignleft size-full wp-image-191" width="125"/></a>Once again, time for the annual trek to Portland, Oregon for OSCON — perhaps for the last time!</p>\n<p>Next year, OSCON is going to be in Austin, TX — which seems like a bit of a mistake to me. Portland and OSCON go together like milk and cookies.</p>\n<p>If you’re going to be at OSCON, make sure to drop by <a href="http://community.redhat.com/blog/2015/07/open-cloud-day-rolls-into-oscon-2015/" target="_blank">Open Cloud Day on Tuesday</a>, and come by the Red Hat booth to say hello!</p></div>', 'title': 'Headed to OSCON', 'date': <GDateTime at 0x5606cd416240>, 'author_homepage': 'http://dissociatedpress.net', 'url': 'http://dissociatedpress.net/headed-to-oscon/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdb40 (TrackerDBCursor at 0x5606cd7b8ad0)>), returned {'fullname': 'Niels de Vos', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://devos.fedorapeople.org/.unlisted/me-head-small.png" alt="" style="float: right;"/>\n <h2 id="release-notes-for-glusterfs-3-5-5"/>Packages for <a href="https://admin.fedoraproject.org/updates/FEDORA-2015-11468/glusterfs-3.5.5-2.fc21">Fedora 21 are available in updates-testing</a>, RPMs and <span style="font-family: &quot;Courier New&quot;,Courier,monospace;">.deb</span>s can be found on the <a href="http://download.gluster.org/pub/gluster/glusterfs/3.5/3.5.5/">main Gluster download site</a>.<br/><br/>This is a bugfix release. The <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.0.md">Release Notes for 3.5.0</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.1.md">3.5.1</a>, <a href="https://draft.blogger.com/null">3.5.2</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.3.md">3.5.3</a> and <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.4.md">3.5.4</a> contain a listing of all the new features that were added and bugs fixed in the GlusterFS 3.5 stable release.<br/> <h3 id="bugs-fixed-">Bugs Fixed:</h3><ul><li><a href="https://bugzilla.redhat.com/1166862">1166862</a>: rmtab file is a bottleneck when lot of clients are accessing a volume through NFS</li><li><a href="https://bugzilla.redhat.com/1217432">1217432</a>: DHT:Quota:- brick process crashed after deleting .glusterfs from backend</li><li><a href="https://bugzilla.redhat.com/1217433">1217433</a>: glusterfsd crashed after directory was removed from the mount point, while self-heal and rebalance were running on the volume</li><li><a href="https://bugzilla.redhat.com/1231641">1231641</a>: cli crashes when listing quota limits with xml output</li></ul><h3 id="known-issues-">Known Issues:</h3><ul><li>The following configuration changes are necessary for \'qemu\' and \'samba vfs plugin\' integration with libgfapi to work seamlessly:<br/> <ol><li><code>gluster volume set &lt;volname&gt; server.allow-insecure on</code></li><li>restarting the volume is necessary<br/> <pre><code> gluster volume stop &lt;volname&gt;<br/> gluster volume start &lt;volname&gt;<br/></code></pre></li><li>Edit <code>/etc/glusterfs/glusterd.vol</code> to contain this line:<br/> <pre><code> option rpc-auth-allow-insecure on<br/></code></pre></li><li>restarting glusterd is necessary<br/> <pre><code> service glusterd restart<br/></code></pre>More details are also documented in the Gluster Wiki on the <a href="http://www.gluster.org/community/documentation/index.php/Libgfapi_with_qemu_libvirt">Libgfapi with qemu libvirt</a> page.<br/> </li></ol></li><li>For Block Device translator based volumes open-behind translator at the client side needs to be disabled.<br/> <pre><code>gluster volume set &lt;volname&gt; performance.open-behind disabled<br/></code></pre></li><li>libgfapi clients calling <code>glfs_fini</code> before a successful <code>glfs_init</code> will cause the client to hang as reported <a href="http://lists.gnu.org/archive/html/gluster-devel/2014-04/msg00179.html">here</a>. The workaround is NOT to call <code>glfs_fini</code> for error cases encountered before a successful <code>glfs_init</code>. This is being tracked in <a href="https://bugzilla.redhat.com/1134050">Bug 1134050</a> for glusterfs-3.5 and <a href="https://bugzilla.redhat.com/1093594">Bug 1093594</a> for mainline.<br/> </li><li>If the <code>/var/run/gluster</code> directory does not exist enabling quota will likely fail (<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1117888">Bug 1117888</a>).<br/> </li></ul></div>', 'title': 'Another stable release, GlusterFS 3.5.5 is ready', 'date': <GDateTime at 0x5606cd404340>, 'author_homepage': 'http://blog.nixpanic.net/search/label/Fedora', 'url': 'http://blog.nixpanic.net/2015/07/another-stable-release-glusterfs-355-is.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdb40 (TrackerDBCursor at 0x5606cd7b8ad0)>), returned {'fullname': 'Jörg Stephan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <a href="http://sendmespamids.blogspot.com/2015/07/encoded-bot-execution-from-16220914224.html?spref=bl">SendMeSpam: Encoded bot execution from 162.209.14.224 includin...</a>: 2015-07-19 16:28:52 Source IP: 162.209.14.224 Country: US RiskScore: 1 Malware: [] POST //%63%67%69%2d%62%69%6e/%70%68%70?%2d%64+%61%6c%6c%...<img src="http://feeds.feedburner.com/~r/LinuxserverDerRest/~4/kolnxm8xS0Q" alt="" height="1" width="1"/></div>', 'title': 'SendMeSpam: Encoded bot execution from 162.209.14.224 includin...', 'date': <GDateTime at 0x5606cd4132a0>, 'author_homepage': 'http://amelinux.blogspot.com/', 'url': 'http://feedproxy.google.com/~r/LinuxserverDerRest/~3/kolnxm8xS0Q/sendmespam-encoded-bot-execution-from.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdb40 (TrackerDBCursor at 0x5606cd7b8ad0)>), returned {'fullname': 'sonalkr132', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p>Project: <a href="https://github.com/glittergallery/GlitterGallery" target="_blank">GlitterGallery</a></p>\n<p>We had a minor set back with implementation of git protocols. I worked on git https protocol but later I found out that <a href="http://sparkleshare.org" target="_blank">sparkleshare</a>\xa0only supports ssh protocol. Until now we were planning to host on <a href="http://openshift.redhat.com" target="_blank">openshift</a>.\xa0I needed access of ~/.ssh/authorized_keys file for git ssh to work but OS doesn’t give away that access. Time to move to VPS. <a href="https://fedoraproject.org/wiki/User:Kevin">Kevin</a>\xa0got me set up with one and <a href="https://fedoraproject.org/wiki/User:Pingou" target="_blank">Pingou</a>\xa0helped me figure out a few details.</p>\n<p>First I needed to make changes to our web interface so that users can add their public key to their profiles. This would also mean addition of a keys model and generation of fingerprint for keys. Next thing is validation of keys when push or pull is made over ssh. This involves two steps namely, authentication and authorization. OpenSSH server handles the authentication part and for authorization I have set up git shell, which makes an api call to glittergallery to check user access. Besides authorization git shell also limits ssh access to git related commands.</p>\n<p>Git shell I am using is just a fork of <a href="https://github.com/gitlabhq/gitlab-shell" target="_blank">gitlab-shell</a>. I am hoping that I won’t need to make any changes to it, however we won’t be supporting all the features (git-annex and git-lfs) of gitlab-shell yet.</p><br/> <a href="http://feeds.wordpress.com/1.0/gocomments/chasingcrazydreams.wordpress.com/49/" rel="nofollow"><img src="http://feeds.wordpress.com/1.0/comments/chasingcrazydreams.wordpress.com/49/" alt="" border="0"/></a> <img src="https://pixel.wp.com/b.gif?host=chasingcrazydreams.wordpress.com&amp;blog=87948641&amp;post=49&amp;subd=chasingcrazydreams&amp;ref=&amp;feed=1" alt="" height="1" border="0" width="1"/></div>', 'title': 'Git over ssh', 'date': <GDateTime at 0x5606cd3f79a0>, 'author_homepage': 'https://chasingcrazydreams.wordpress.com', 'url': 'https://chasingcrazydreams.wordpress.com/2015/07/19/git-over-ssh/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdb40 (TrackerDBCursor at 0x5606cd7b8ad0)>), returned {'fullname': 'Major Hayden', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://major.io/wp-content/uploads/2014/03/cropped-hayden_major_01_bw.jpg" alt="" style="float: right;"/>\n <p><a href="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1.jpg"><img src="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1-300x212.jpg" alt="Thinkpad X1 Carbon 3rd gen" height="212" class="alignright size-medium wp-image-5452" width="300"/></a>My upgrade to Fedora 22 on the ThinkPad X1 Carbon was fairly uneventful and the hiccups were minor. One of the more annoying items that I’ve been struggling with for quite some time is how to boot up with the wireless LAN and Bluetooth disabled by default. Restoring wireless and Bluetooth state between reboots is normally handled quite well in Fedora.</p>\n<p>In Fedora 21, NetworkManager saved my settings between reboots. For example, if I shut down with wifi off and Bluetooth on, the laptop would boot up later with wifi off and Bluetooth on. This wasn’t working well in Fedora 22: both the wifi and Bluetooth were always enabled by default.</p>\n<h3>Digging into rfkill</h3>\n<p>I remembered <a href="https://wireless.wiki.kernel.org/en/users/documentation/rfkill">rfkill</a> and began testing out some commands. It detected that I had disabled both devices via NetworkManager (soft):</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html">$ rfkill list\n0: tpacpi_bluetooth_sw: Bluetooth\n Soft blocked: yes\n Hard blocked: no\n2: phy0: Wireless LAN\n Soft blocked: yes\n Hard blocked: no</pre></td></tr></tbody></table></div>\n\n<p>It looked like systemd has some hooks already configured to manage rfkill via the <a href="http://www.freedesktop.org/software/systemd/man/systemd-rfkill@.service.html">systemd-rfkill</a> service. However, something strange happened when I tried to start the service:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># systemctl start systemd-rfkill@0\nFailed to start systemd-rfkill@0.service: Unit systemd-rfkill@0.service is masked.</pre></td></tr></tbody></table></div>\n\n<p>Well, that’s certainly weird. While looking into why it’s masked, I found an empty file in <code>/etc/systemd</code>:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># ls -al /etc/systemd/system/systemd-rfkill@.service \n-rwxr-xr-x. 1 root root 0 May 11 16:36 /etc/systemd/system/systemd-rfkill@.service</pre></td></tr></tbody></table></div>\n\n<p>I don’t remember making that file. Did something else put it there?</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># rpm -qf /etc/systemd/system/systemd-rfkill@.service\ntlp-0.7-4.fc22.noarch</pre></td></tr></tbody></table></div>\n\n<p>Ah, <a href="http://linrunner.de/en/tlp/tlp.html">tlp</a>!</p>\n<h3>Configuring tlp</h3>\n<p>I looked in tlp’s configuration file in <code>/etc/default/tlp</code> and found a few helpful configuration items:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;"># Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown</span>\n<span style="color: #666666; font-style: italic;"># on system startup: 0=disable, 1=enable.</span>\n<span style="color: #666666; font-style: italic;"># Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below</span>\n<span style="color: #666666; font-style: italic;"># are ignored when this is enabled!</span>\n<span style="color: #007800;">RESTORE_DEVICE_STATE_ON_STARTUP</span>=<span style="color: #000000;">0</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_STARTUP="wifi"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (workaround for devices that are blocking shutdown).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (to prevent other operating systems from missing radios).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_SHUTDOWN="wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on AC: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_AC="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery when not in use (not connected):</span>\n<span style="color: #666666; font-style: italic;"># bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>So tlp’s default configuration doesn’t restore device state <b>and</b> it masked systemd’s rfkill service. I adjusted one line in tlp’s configuration and rebooted:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #007800;">DEVICES_TO_DISABLE_ON_STARTUP</span>=<span style="color: #ff0000;">"bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>After the reboot, both the wifi and Bluetooth functionality were shut off! That’s exactly what I needed.</p>\n<h3>Extra credit</h3>\n<p>Thanks to a coworker, I was able to make a NetworkManager script to automatically shut off the wireless LAN whenever I connected to a network via ethernet. This is typically what I do when coming back from an in-person meeting to my desk (where I have ethernet connectivity).</p>\n<p>If you want the same automation, just drop this script into <code>/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh</code> and make it executable:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>\n<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LC_ALL</span>=C\n\xa0\nenable_disable_wifi <span style="color: #7a0874; font-weight: bold;">(</span><span style="color: #7a0874; font-weight: bold;">)</span>\n<span style="color: #7a0874; font-weight: bold;">{</span>\n <span style="color: #007800;">result</span>=$<span style="color: #7a0874; font-weight: bold;">(</span>nmcli dev <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">"ethernet"</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-w</span> <span style="color: #ff0000;">"connected"</span><span style="color: #7a0874; font-weight: bold;">)</span>\n <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">"<span style="color: #007800;">$result</span>"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n nmcli radio wifi off\n <span style="color: #000000; font-weight: bold;">fi</span>\n<span style="color: #7a0874; font-weight: bold;">}</span>\n\xa0\n<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #ff0000;">"$2"</span> = <span style="color: #ff0000;">"up"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n enable_disable_wifi\n<span style="color: #000000; font-weight: bold;">fi</span></pre></td></tr></tbody></table></div>\n\n<p>Unplug the ethernet connection, start wifi, and then plug the ethernet connection back in. Once NetworkManager fully connects (DHCP lease obtained, connectivity check passes), the wireless LAN should shut off automatically.</p>\n<p>The post <a href="https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/" rel="nofollow">Restoring wireless and Bluetooth state after reboot in Fedora 22</a> appeared first on <a href="https://major.io" rel="nofollow">major.io</a>.</p></div>', 'title': 'Restoring wireless and Bluetooth state after reboot in Fedora 22', 'date': <GDateTime at 0x5606cd406060>, 'author_homepage': 'https://major.io', 'url': 'https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdb40 (TrackerDBCursor at 0x5606cd7b8ad0)>), returned {'fullname': 'This week in Fedora', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <div id="activities" class="section">\n<h2>Activities</h2>\n<table border="1" class="docutils"><colgroup><col width="42%"/><col width="15%"/><col width="42%"/></colgroup><thead valign="bottom"><tr><th class="head">Activities</th>\n<th class="head">Amount</th>\n<th class="head">Diff to previous week</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>503</td>\n<td>-01.95%</td>\n</tr><tr><td>Builds</td>\n<td>16382</td>\n<td>-14.23%</td>\n</tr><tr><td>Copr build completed</td>\n<td>3913</td>\n<td>-07.67%</td>\n</tr><tr><td>Copr build started</td>\n<td>3932</td>\n<td>-09.73%</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>550</td>\n<td>+81.52%</td>\n</tr><tr><td>FAS user created</td>\n<td>112</td>\n<td>+27.27%</td>\n</tr><tr><td>Meeting completed</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>Meeting started</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>New packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Posts on the planet</td>\n<td>67</td>\n<td>+34.00%</td>\n</tr><tr><td>Retired packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Updates to stable</td>\n<td>244</td>\n<td>-33.33%</td>\n</tr><tr><td>Updates to testing</td>\n<td>448</td>\n<td>+00.22%</td>\n</tr></tbody></table></div>\n<div id="top-contributors-of-the-week" class="section">\n<h2>Top contributors of the week</h2>\n<table border="1" class="docutils"><colgroup><col width="31%"/><col width="69%"/></colgroup><thead valign="bottom"><tr><th class="head">Activites</th>\n<th class="head">Contributors</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>kelvar81 (8), binaryop (6), itamarjp (6)</td>\n</tr><tr><td>Builds</td>\n<td>pbrobinson (6237), sharkcz (3578), karsten (2819)</td>\n</tr><tr><td>Copr build completed</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Copr build started</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>jkurik (41), adamwill (33), fedoradummy (28)</td>\n</tr><tr><td>Meeting completed</td>\n<td>nirik (10), dgilmore (8), danofsatx (5)</td>\n</tr><tr><td>Meeting started</td>\n<td>decause (2), dgilmore (2), nirik (2)</td>\n</tr><tr><td>New packages</td>\n<td>\xa0</td>\n</tr><tr><td>Posts on the planet</td>\n<td>adamwill (8), admin (5), johe (3)</td>\n</tr><tr><td>Retired packages</td>\n<td>\xa0</td>\n</tr><tr><td>Updates to stable</td>\n<td>siwinski (45), hguemar (19), remi (18)</td>\n</tr><tr><td>Updates to testing</td>\n<td>remi (36), raveit65 (24), orion (20)</td>\n</tr></tbody></table></div></div>', 'title': 'Activities from Mon, 13 Jul 2015 to Sun, 19 Jul 2015', 'date': <GDateTime at 0x5606cd415600>, 'author_homepage': 'http://thisweekinfedora.org', 'url': 'http://thisweekinfedora.org/posts/2015_07_19.html', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdb40 (TrackerDBCursor at 0x5606cd7b8ad0)>), returned {'fullname': 'dustymabe', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <h1 id="history">History</h1>\n<p>In <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> of this series I discussed why I desired a computer setup where I can do full system snapshots so I could seamlessly roll back at will. I also gave an overview of how I went about setting up a system so it could take advantage of <code>BTRFS</code> and <code>snapper</code> to do full system snapshotting and recovery. In this final post of the series I will give an overview of how to get <code>snapper</code> installed and configured on the system and walk through using it to do a rollback.</p>\n<h1 id="installing-and-configuring-snapper">Installing and Configuring Snapper</h1>\n<p>First things first, as part of this whole setup I want to be able to tell how much space each one of my snapshots are taking up. I covered how to do this in a <a href="http://dustymabe.com/2013/09/22/btrfs-how-big-are-my-snapshots/">previous post</a>, but the way you do it is by enabled <code>quota</code> on the <code>BTRFS</code> filesystem:</p>\n<pre><code>[root@localhost ~]# btrfs quota enable / \n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\n[root@localhost ~]# btrfs qgroup show /\nWARNING: Rescan is running, qgroup data may be incorrect\nqgroupid rfer excl \n-------- ---- ---- \n0/5 975.90MiB 975.90MiB \n0/258 16.00KiB 16.00KiB</code></pre>\n<p>You can see from the output that we currently have two subvolumes. One of them is the <em>root subvolume</em> while the other is a subvolume automatically created by <code>systemd</code> for <code>systemd-nspawn</code> container images.</p>\n<p>Now that we have quota enabled let\'s get <code>snapper</code> installed and configured:</p>\n<pre><code>[root@localhost ~]# dnf install -y snapper\n...\nComplete!\n[root@localhost ~]# snapper --config=root create-config /\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \n[root@localhost ~]# snapper list-configs\nConfig | Subvolume\n-------+----------\nroot | / \n[root@localhost ~]#\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 83 top level 5 path .snapshots</code></pre>\n<p>So we used the <code>snapper</code> command to create a configuration for <code>BTRFS</code> filesystem mounted at <code>/</code>. As part of this process we can see from the <code>btrfs subvolume list /</code> command that <code>snapper</code> also created a <code>.snapshots</code> subvolume. This subvolume will be used to house the <code>COW</code> snapshots that are taken of the system.</p>\n<p>The next thing we want to do is add an entry to <code>fstab</code> to make it so that regardless of what subvolume we are actually booted into we will always be able to view the <code>.snapshots</code> subvolume and all nested subvolumes (snapshots):</p>\n<pre><code>[root@localhost ~]# echo \'/dev/vgroot/lvroot /.snapshots btrfs subvol=.snapshots 0 0\' &gt;&gt; /etc/fstab</code></pre>\n<h1 id="taking-snapshots">Taking Snapshots</h1>\n<p>OK, now that we have snapper installed and the <code>.snapshots</code> subvolume in <code>/etc/fstab</code> we can start creating snapshots:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 5 (FS_TREE)\n[root@localhost ~]# snapper create --description "BigBang"\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang |\n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 90 top level 5 path .snapshots\nID 261 gen 88 top level 260 path .snapshots/1/snapshot\n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/1/snapshot/\nbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var</code></pre>\n<p>We made our first snapshot called <strong>BigBang</strong> and then ran a <code>btrfs subvolume list /</code> to view that a new snapshot was actually created. Notice at the top of the output of the sections that we ran a <code>btrfs subvolume get-default /</code>. This outputs what the currently set <em>default subvolume</em> is for the <code>BTRFS</code> filesystem. Right now we are booted into the <em>root subvolume</em> but that will change as soon as we decide we want to use one of the snapshots for rollback.</p>\n<p>Since we took a snapshot let\'s go ahead and make some changes to the system:</p>\n<pre><code>[root@localhost ~]# dnf install -y htop\n[root@localhost ~]# rpm -q htop\nhtop-1.0.3-4.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# snapper status 1..0 | grep htop\n+..... /usr/bin/htop\n+..... /usr/share/doc/htop\n+..... /usr/share/doc/htop/AUTHORS\n+..... /usr/share/doc/htop/COPYING\n+..... /usr/share/doc/htop/ChangeLog\n+..... /usr/share/doc/htop/README\n+..... /usr/share/man/man1/htop.1.gz\n+..... /usr/share/pixmaps/htop.png\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_data\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_type\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/command_line\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/from_repo\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/installed_by\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/reason\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/releasever</code></pre>\n<p>So from this we installed <code>htop</code> and then compared the current running system (<code>0</code>) with snapshot <code>1</code>.</p>\n<h1 id="rolling-back">Rolling Back</h1>\n<p>Now that we have taken a previous snapshot and have since made a change to the system we can use the <code>snapper rollback</code> functionality to get back to the state the system was in before we made the change. Let\'s do the rollback to get back to the snapshot <code>1</code> <strong>BigBang</strong> state:</p>\n<pre><code>[root@localhost ~]# snapper rollback 1\nCreating read-only snapshot of current system. (Snapshot 2.)\nCreating read-write snapshot of snapshot 1. (Snapshot 3.)\nSetting default subvolume to snapshot 3.\n[root@localhost ~]# reboot</code></pre>\n<p>As part of the rollback process you specify to <code>snapper</code> which snapshot you want to go back to. It then creates a read-only snapshot of the current system (in case you change your mind and want to get back to where you currently are) and then a new read-write subvolume based on the snapshot you specified to go back to. It then sets the <em>default subvolume</em> to be the newly created read-write subvolume it just created. After a reboot you will be booted into the new read-write subvolume and your state should be exactly as it was at the time you made the original snapshot.</p>\n<p>In our case, after reboot we should now be booted into snapshot 3 as indicated by the output of the <code>snapper rollback</code> command above and we should be able to inspect information about all of the snapshots on the system:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 263 gen 104 top level 260 path .snapshots/3/snapshot\n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | | \n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/\n1 2 3\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 100 top level 5 path .snapshots\nID 261 gen 98 top level 260 path .snapshots/1/snapshot\nID 262 gen 97 top level 260 path .snapshots/2/snapshot\nID 263 gen 108 top level 260 path .snapshots/3/snapshot</code></pre>\n<p>And the big test is to see if the change we made to the system was actually reverted:</p>\n<pre><code>[root@localhost ~]# rpm -q htop\npackage htop is not installed</code></pre>\n<p>Bliss!!</p>\n<p>Now in my case I like to have more descriptive notes on my snapshots so I\'ll go back now and give some notes for snapshots 2 and 3:</p>\n<pre><code>[root@localhost ~]# snapper modify --description "installed htop" 2\n[root@localhost ~]# snapper modify --description "rollback to 1 - read/write" 3 \n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+----------------------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | installed htop | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | rollback to 1 - read/write |</code></pre>\n<p>We can also see how much space (shared and exclusive each of the snapshots are taking up:</p>\n<pre><code>[root@localhost ~]# btrfs qgroup show / \nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 2.60MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.08GiB 18.91MiB</code></pre>\n<p>Now that is useful info so you can know how much space you will be recovering when you delete snapshots in the future.</p>\n<h1 id="updating-the-kernel">Updating The Kernel</h1>\n<p>I mentioned in <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> that I had to get a special rebuild of <code>GRUB</code> with some patches from the <code>SUSE</code> guys in order to get booting from the default subvolume to work. This was all needed so that I can update the kernel as normal and have the <code>GRUB</code> files that get used be the ones that are in the actual subvolume I am currently using. So let\'s test it out by doing a full system update (including a kernel update):</p>\n<pre><code>[root@localhost ~]# dnf update -y\n...\nInstall 8 Packages\nUpgrade 173 Packages\n...\nComplete!\n[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# btrfs qgroup show /\nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 11.96MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.19GiB 444.35MiB</code></pre>\n<p>So we did a full system upgrade that upgraded 173 packages and installed a few others. We can see now that the current subvolume (snapshot <code>3</code> with ID <code>263</code>) now has 444MiB of exclusive data. This makes sense since all of the other snapshots were from before the full system update.</p>\n<p>Let\'s create a new snapshot that represents the state of the system right after we did the full system update and then reboot:</p>\n<pre><code>[root@localhost ~]# snapper create --description "full system upgrade"\n[root@localhost ~]# reboot</code></pre>\n<p>After reboot we can now check to see if we have properly booted the recently installed kernel:</p>\n<pre><code>[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# uname -r\n4.0.7-300.fc22.x86_64</code></pre>\n<p>Bliss again. Yay! And I\'m Done.</p>\n<p>Enjoy!</p>\n<p>Dusty</p></div>', 'title': 'Fedora BTRFS+Snapper PART 2: Full System Snapshot/Rollback', 'date': <GDateTime at 0x5606cd4162c0>, 'author_homepage': 'http://dustymabe.com', 'url': 'http://dustymabe.com/2015/07/19/fedora-btrfssnapper-part-2-full-system-snapshotrollback/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdb40 (TrackerDBCursor at 0x5606cd7b8ad0)>), returned {'fullname': 'Jamie Nguyen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://jamielinux.fedorapeople.org/avatar.png" alt="" style="float: right;"/>\n <p><a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> is an Ansible playbook I created to make it easy to\ndeploy Discourse without Docker. It supports several distributions, including\nCentOS, Debian, Fedora and Ubuntu. Testing and feedback are very welcome!</p>\n<p><a href="http://www.discourse.org/" class="reference external">Discourse</a> is an open source discussion forum application. The Discourse team\nonly supports installation via their offical Docker image. This is a sensible\nmove as the production environment can be kept more consistent across all\ninstallations, making it harder for administrators to break their site with a\nconfiguration error.</p>\n<p>However, some people may want to avoid using Docker. Perhaps you already manage\nyour servers with Ansible, or you want more flexibility over your production\nenvironment. Perhaps you need more secure isolation (eg, hardware\nvirtualization) than Docker can provide (as <a href="https://opensource.com/business/14/7/docker-security-selinux" class="reference external">containers do not contain</a>). If so, you\nmight want to give <a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> a try.</p></div>', 'title': 'Easily install Discourse using Ansible', 'date': <GDateTime at 0x5606cd419740>, 'author_homepage': 'https://jamielinux.com/blog/', 'url': 'https://jamielinux.com/blog/easily-install-discourse-using-ansible/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16bdb40 (TrackerDBCursor at 0x5606cd7b8ad0)>), returned {'fullname': 'Daniel.Pocock', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.debian.org/heads/pocock.png" alt="" style="float: right;"/>\n <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><a href="https://fedoraproject.org/wiki/User:Zoltanh721">Zoltan (Zoltanh721)</a> recently <a href="http://wordpress-zoltanh721.rhcloud.com/?p=24">blogged about WebRTC for the Fedora community and Fedora desktop</a>.</p>\n<p><a href="https://fedrtc.org">https://fedrtc.org</a> has been running for a while now and this has given many people a chance to get a taste of regular SIP and WebRTC-based SIP. As suggested in Zoltan\'s blog, it has convenient integration with Fedora SSO and as the <a href="http://danielpocock.com/free-and-open-webrtc-for-the-fedora-community">source code is available</a>, people are welcome to see how it was built and use it for other projects.</p>\n<h3>Issues with Chrome/Chromium on Linux</h3>\n<p>If you tried any of <a href="https://fedrtc.org">FedRTC.org</a>, <a href="https://rtc.debian.org">rtc.debian.org</a> or <a href="https://meet.jit.si">meet.jit.si</a> using Chrome/Chromium on Linux, you may have found that the call appears to be connected but there is no media. This is a <a href="https://code.google.com/p/chromium/issues/detail?id=501318">bug</a> and the Chromium developers are on to it. You can work around this by trying an older version of Chromium (it still works with v37 from Debian wheezy) or Firefox/Iceweasel.</p>\n<h3>WebRTC is not everything</h3>\n<p><a href="http://danielpocock.com/tags/webrtc">WebRTC</a> offers many great possibilities for people to quickly build and deploy RTC services to a large user base, especially when using components like <a href="http://jscommunicator.org">JSCommunicator</a> or <a href="http://drucall.org">the DruCall WebRTC plugin for Drupal</a>.</p>\n<p>However, it is not a silver bullet. For example, there remain concerns about how to receive incoming calls. How do you know which browser tab is ringing when you have many tabs open at once? This may require greater browser/desktop integration and that has security implications for JavaScript. Whether users on battery-powered devices can really leave JavaScript running for extended periods of time waiting for incoming calls is another issue, especially when you consider that many web sites contain some JavaScript that is less than efficient.</p>\n<p>Native applications and mobile apps like <a href="http://lumicall.org">Lumicall</a> continue to offer the most optimized solution for each platform although WebRTC currently offers the most convenient way for people to place a <em>Call me</em> link on their web site or portal.</p>\n<h3>Deploy it yourself</h3>\n<p>The <a href="http://rtcquickstart.org">RTC Quick Start Guide</a> offers step-by-step instructions and a thorough discussion of the architecture for people to start deploying RTC and WebRTC on their own servers using standard packages on many of the most popular Linux distributions, including Debian, Ubuntu, RHEL, CentOS and Fedora.</p>\n</div></div></div></div>', 'title': 'RTC status on Debian, Ubuntu and Fedora', 'date': <GDateTime at 0x5606cd403880>, 'author_homepage': 'http://danielpocock.com/tags/fedora', 'url': 'http://danielpocock.com/rtc-status-on-debian-ubuntu-and-fedora-july-2015', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:164 ||||gnomenews.tracker.get_posts_for_channel(<Tracker object at 0x7f7fa16a67e0 (gnomenews+tracker+Tracker at 0x5606cd3ec7a0)>, 'https://planet.fedoraproject.org/atom.xml', 10), returned [{'fullname': 'Adam Šamalík', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://pbs.twimg.com/profile_images/505677536232091648/N1HMnx1h_400x400.jpeg" alt="" style="float: right;"/>\n <p>As in the last year, July, for some reason, happened to be a great time to post some news about our <a href="http://copr.fedoraproject.org">Copr Build Service</a>. At this time, it’s about integrating Copr with:</p>\n<ul>\n<li><a href="http://www.patternfly.org">Patternfly</a> – an open interface project</li>\n<li><a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a remote Git repository designed to hold RPM package sources</li>\n</ul>\n<p><em>If you can’t wait to see it, you can check <a href="http://copr-fe-dev.cloud.fedoraproject.org/">the development server</a> that is hopefully running on <a href="http://copr-fe-dev.cloud.fedoraproject.org/">copr-fe-dev.cloud.fedoraproject.org</a>. But please, remember, it’s a development server – so all the projects built here are a subject of deletion, destruction and all kinds of randomization without notice.</em></p>\n<h3>Dist Git for Copr</h3>\n<p>It all started with a need of <strong>uploading sources</strong> to the Copr itself – as the only way of building your package was to provide a URL pointing to it. That, however, required all users to have their own public file storage.</p>\n<p>We decided to go the Fedora way and use <a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a combination of git repository to store spec files, lookaside cache to store sources, and Gitolite to manage access permissions. Each package will be stored in a repo named as ‘username/project/package’. Each repo will contain branches that represent a target platform. For example: ‘f22′ for Fedora 22, ‘epel7′ for Epel for Centos 7, etc.</p>\n<p><img src="https://github.com/release-engineering/dist-git/raw/master/images/storage.png" alt="" height="1150" class="aligncenter" width="1592"/></p>\n<p>It will be gradually deployed in production. The first step is to <strong>enable users to upload their .src.rpm</strong> files into Copr. At this step, Dist Git will be used as a storage only. Direct access to the repositories will come afterwards.</p>\n<h3>New User Interface\xa0 Patternfly</h3>\n<p>Enabling Dist Git required some changes to the user interface as well. We didn’t use any framework, that would help us to easily create new elements in the UI. Instead, we had a custom CSS that received new lines of code with each change. As you can imagine, each change took a bit longer than desired, the CSS became messy, and yes, the interface itself became messy as well. At this point, I decided that we need to do a step forward and we finally agreed to rewrite the user interface to <a href="https://www.patternfly.org/">Patternfly</a>! Yay!</p>\n<h4>The Old Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1-819x1024.png" alt="The old Copr interface" height="750" class="alignleft wp-image-181 size-large" width="600"/></a></p>\n<h4>The New Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1-1024x872.png" alt="The new Copr interface" height="511" class="alignleft wp-image-182 size-large" width="600"/></a></p>\n<h3>We need your feedback!</h3>\n<p>I would like to make Copr as friendly as possible. If you want to help me with that, please provide a feedback as a comment. Do you like it? Do you hate it? Is there anything you miss in the interface? Your feedback is much appreciated!</p></div>', 'title': 'Copr, Dist Git and Patternfly', 'date': <GDateTime at 0x5606cd417ec0>, 'author_homepage': 'http://blog.samalik.com', 'url': 'http://blog.samalik.com/copr-dist-git-and-patternfly/', 'is_read': False, 'author_email': None}, {'fullname': 'jzb', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p><a href="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg"><img src="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg" alt="oscon-logo" height="125" class="alignleft size-full wp-image-191" width="125"/></a>Once again, time for the annual trek to Portland, Oregon for OSCON — perhaps for the last time!</p>\n<p>Next year, OSCON is going to be in Austin, TX — which seems like a bit of a mistake to me. Portland and OSCON go together like milk and cookies.</p>\n<p>If you’re going to be at OSCON, make sure to drop by <a href="http://community.redhat.com/blog/2015/07/open-cloud-day-rolls-into-oscon-2015/" target="_blank">Open Cloud Day on Tuesday</a>, and come by the Red Hat booth to say hello!</p></div>', 'title': 'Headed to OSCON', 'date': <GDateTime at 0x5606cd416240>, 'author_homepage': 'http://dissociatedpress.net', 'url': 'http://dissociatedpress.net/headed-to-oscon/', 'is_read': False, 'author_email': None}, {'fullname': 'Niels de Vos', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://devos.fedorapeople.org/.unlisted/me-head-small.png" alt="" style="float: right;"/>\n <h2 id="release-notes-for-glusterfs-3-5-5"/>Packages for <a href="https://admin.fedoraproject.org/updates/FEDORA-2015-11468/glusterfs-3.5.5-2.fc21">Fedora 21 are available in updates-testing</a>, RPMs and <span style="font-family: &quot;Courier New&quot;,Courier,monospace;">.deb</span>s can be found on the <a href="http://download.gluster.org/pub/gluster/glusterfs/3.5/3.5.5/">main Gluster download site</a>.<br/><br/>This is a bugfix release. The <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.0.md">Release Notes for 3.5.0</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.1.md">3.5.1</a>, <a href="https://draft.blogger.com/null">3.5.2</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.3.md">3.5.3</a> and <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.4.md">3.5.4</a> contain a listing of all the new features that were added and bugs fixed in the GlusterFS 3.5 stable release.<br/> <h3 id="bugs-fixed-">Bugs Fixed:</h3><ul><li><a href="https://bugzilla.redhat.com/1166862">1166862</a>: rmtab file is a bottleneck when lot of clients are accessing a volume through NFS</li><li><a href="https://bugzilla.redhat.com/1217432">1217432</a>: DHT:Quota:- brick process crashed after deleting .glusterfs from backend</li><li><a href="https://bugzilla.redhat.com/1217433">1217433</a>: glusterfsd crashed after directory was removed from the mount point, while self-heal and rebalance were running on the volume</li><li><a href="https://bugzilla.redhat.com/1231641">1231641</a>: cli crashes when listing quota limits with xml output</li></ul><h3 id="known-issues-">Known Issues:</h3><ul><li>The following configuration changes are necessary for \'qemu\' and \'samba vfs plugin\' integration with libgfapi to work seamlessly:<br/> <ol><li><code>gluster volume set &lt;volname&gt; server.allow-insecure on</code></li><li>restarting the volume is necessary<br/> <pre><code> gluster volume stop &lt;volname&gt;<br/> gluster volume start &lt;volname&gt;<br/></code></pre></li><li>Edit <code>/etc/glusterfs/glusterd.vol</code> to contain this line:<br/> <pre><code> option rpc-auth-allow-insecure on<br/></code></pre></li><li>restarting glusterd is necessary<br/> <pre><code> service glusterd restart<br/></code></pre>More details are also documented in the Gluster Wiki on the <a href="http://www.gluster.org/community/documentation/index.php/Libgfapi_with_qemu_libvirt">Libgfapi with qemu libvirt</a> page.<br/> </li></ol></li><li>For Block Device translator based volumes open-behind translator at the client side needs to be disabled.<br/> <pre><code>gluster volume set &lt;volname&gt; performance.open-behind disabled<br/></code></pre></li><li>libgfapi clients calling <code>glfs_fini</code> before a successful <code>glfs_init</code> will cause the client to hang as reported <a href="http://lists.gnu.org/archive/html/gluster-devel/2014-04/msg00179.html">here</a>. The workaround is NOT to call <code>glfs_fini</code> for error cases encountered before a successful <code>glfs_init</code>. This is being tracked in <a href="https://bugzilla.redhat.com/1134050">Bug 1134050</a> for glusterfs-3.5 and <a href="https://bugzilla.redhat.com/1093594">Bug 1093594</a> for mainline.<br/> </li><li>If the <code>/var/run/gluster</code> directory does not exist enabling quota will likely fail (<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1117888">Bug 1117888</a>).<br/> </li></ul></div>', 'title': 'Another stable release, GlusterFS 3.5.5 is ready', 'date': <GDateTime at 0x5606cd404340>, 'author_homepage': 'http://blog.nixpanic.net/search/label/Fedora', 'url': 'http://blog.nixpanic.net/2015/07/another-stable-release-glusterfs-355-is.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}, {'fullname': 'Jörg Stephan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <a href="http://sendmespamids.blogspot.com/2015/07/encoded-bot-execution-from-16220914224.html?spref=bl">SendMeSpam: Encoded bot execution from 162.209.14.224 includin...</a>: 2015-07-19 16:28:52 Source IP: 162.209.14.224 Country: US RiskScore: 1 Malware: [] POST //%63%67%69%2d%62%69%6e/%70%68%70?%2d%64+%61%6c%6c%...<img src="http://feeds.feedburner.com/~r/LinuxserverDerRest/~4/kolnxm8xS0Q" alt="" height="1" width="1"/></div>', 'title': 'SendMeSpam: Encoded bot execution from 162.209.14.224 includin...', 'date': <GDateTime at 0x5606cd4132a0>, 'author_homepage': 'http://amelinux.blogspot.com/', 'url': 'http://feedproxy.google.com/~r/LinuxserverDerRest/~3/kolnxm8xS0Q/sendmespam-encoded-bot-execution-from.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}, {'fullname': 'sonalkr132', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p>Project: <a href="https://github.com/glittergallery/GlitterGallery" target="_blank">GlitterGallery</a></p>\n<p>We had a minor set back with implementation of git protocols. I worked on git https protocol but later I found out that <a href="http://sparkleshare.org" target="_blank">sparkleshare</a>\xa0only supports ssh protocol. Until now we were planning to host on <a href="http://openshift.redhat.com" target="_blank">openshift</a>.\xa0I needed access of ~/.ssh/authorized_keys file for git ssh to work but OS doesn’t give away that access. Time to move to VPS. <a href="https://fedoraproject.org/wiki/User:Kevin">Kevin</a>\xa0got me set up with one and <a href="https://fedoraproject.org/wiki/User:Pingou" target="_blank">Pingou</a>\xa0helped me figure out a few details.</p>\n<p>First I needed to make changes to our web interface so that users can add their public key to their profiles. This would also mean addition of a keys model and generation of fingerprint for keys. Next thing is validation of keys when push or pull is made over ssh. This involves two steps namely, authentication and authorization. OpenSSH server handles the authentication part and for authorization I have set up git shell, which makes an api call to glittergallery to check user access. Besides authorization git shell also limits ssh access to git related commands.</p>\n<p>Git shell I am using is just a fork of <a href="https://github.com/gitlabhq/gitlab-shell" target="_blank">gitlab-shell</a>. I am hoping that I won’t need to make any changes to it, however we won’t be supporting all the features (git-annex and git-lfs) of gitlab-shell yet.</p><br/> <a href="http://feeds.wordpress.com/1.0/gocomments/chasingcrazydreams.wordpress.com/49/" rel="nofollow"><img src="http://feeds.wordpress.com/1.0/comments/chasingcrazydreams.wordpress.com/49/" alt="" border="0"/></a> <img src="https://pixel.wp.com/b.gif?host=chasingcrazydreams.wordpress.com&amp;blog=87948641&amp;post=49&amp;subd=chasingcrazydreams&amp;ref=&amp;feed=1" alt="" height="1" border="0" width="1"/></div>', 'title': 'Git over ssh', 'date': <GDateTime at 0x5606cd3f79a0>, 'author_homepage': 'https://chasingcrazydreams.wordpress.com', 'url': 'https://chasingcrazydreams.wordpress.com/2015/07/19/git-over-ssh/', 'is_read': False, 'author_email': None}, {'fullname': 'Major Hayden', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://major.io/wp-content/uploads/2014/03/cropped-hayden_major_01_bw.jpg" alt="" style="float: right;"/>\n <p><a href="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1.jpg"><img src="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1-300x212.jpg" alt="Thinkpad X1 Carbon 3rd gen" height="212" class="alignright size-medium wp-image-5452" width="300"/></a>My upgrade to Fedora 22 on the ThinkPad X1 Carbon was fairly uneventful and the hiccups were minor. One of the more annoying items that I’ve been struggling with for quite some time is how to boot up with the wireless LAN and Bluetooth disabled by default. Restoring wireless and Bluetooth state between reboots is normally handled quite well in Fedora.</p>\n<p>In Fedora 21, NetworkManager saved my settings between reboots. For example, if I shut down with wifi off and Bluetooth on, the laptop would boot up later with wifi off and Bluetooth on. This wasn’t working well in Fedora 22: both the wifi and Bluetooth were always enabled by default.</p>\n<h3>Digging into rfkill</h3>\n<p>I remembered <a href="https://wireless.wiki.kernel.org/en/users/documentation/rfkill">rfkill</a> and began testing out some commands. It detected that I had disabled both devices via NetworkManager (soft):</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html">$ rfkill list\n0: tpacpi_bluetooth_sw: Bluetooth\n Soft blocked: yes\n Hard blocked: no\n2: phy0: Wireless LAN\n Soft blocked: yes\n Hard blocked: no</pre></td></tr></tbody></table></div>\n\n<p>It looked like systemd has some hooks already configured to manage rfkill via the <a href="http://www.freedesktop.org/software/systemd/man/systemd-rfkill@.service.html">systemd-rfkill</a> service. However, something strange happened when I tried to start the service:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># systemctl start systemd-rfkill@0\nFailed to start systemd-rfkill@0.service: Unit systemd-rfkill@0.service is masked.</pre></td></tr></tbody></table></div>\n\n<p>Well, that’s certainly weird. While looking into why it’s masked, I found an empty file in <code>/etc/systemd</code>:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># ls -al /etc/systemd/system/systemd-rfkill@.service \n-rwxr-xr-x. 1 root root 0 May 11 16:36 /etc/systemd/system/systemd-rfkill@.service</pre></td></tr></tbody></table></div>\n\n<p>I don’t remember making that file. Did something else put it there?</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># rpm -qf /etc/systemd/system/systemd-rfkill@.service\ntlp-0.7-4.fc22.noarch</pre></td></tr></tbody></table></div>\n\n<p>Ah, <a href="http://linrunner.de/en/tlp/tlp.html">tlp</a>!</p>\n<h3>Configuring tlp</h3>\n<p>I looked in tlp’s configuration file in <code>/etc/default/tlp</code> and found a few helpful configuration items:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;"># Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown</span>\n<span style="color: #666666; font-style: italic;"># on system startup: 0=disable, 1=enable.</span>\n<span style="color: #666666; font-style: italic;"># Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below</span>\n<span style="color: #666666; font-style: italic;"># are ignored when this is enabled!</span>\n<span style="color: #007800;">RESTORE_DEVICE_STATE_ON_STARTUP</span>=<span style="color: #000000;">0</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_STARTUP="wifi"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (workaround for devices that are blocking shutdown).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (to prevent other operating systems from missing radios).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_SHUTDOWN="wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on AC: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_AC="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery when not in use (not connected):</span>\n<span style="color: #666666; font-style: italic;"># bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>So tlp’s default configuration doesn’t restore device state <b>and</b> it masked systemd’s rfkill service. I adjusted one line in tlp’s configuration and rebooted:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #007800;">DEVICES_TO_DISABLE_ON_STARTUP</span>=<span style="color: #ff0000;">"bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>After the reboot, both the wifi and Bluetooth functionality were shut off! That’s exactly what I needed.</p>\n<h3>Extra credit</h3>\n<p>Thanks to a coworker, I was able to make a NetworkManager script to automatically shut off the wireless LAN whenever I connected to a network via ethernet. This is typically what I do when coming back from an in-person meeting to my desk (where I have ethernet connectivity).</p>\n<p>If you want the same automation, just drop this script into <code>/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh</code> and make it executable:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>\n<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LC_ALL</span>=C\n\xa0\nenable_disable_wifi <span style="color: #7a0874; font-weight: bold;">(</span><span style="color: #7a0874; font-weight: bold;">)</span>\n<span style="color: #7a0874; font-weight: bold;">{</span>\n <span style="color: #007800;">result</span>=$<span style="color: #7a0874; font-weight: bold;">(</span>nmcli dev <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">"ethernet"</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-w</span> <span style="color: #ff0000;">"connected"</span><span style="color: #7a0874; font-weight: bold;">)</span>\n <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">"<span style="color: #007800;">$result</span>"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n nmcli radio wifi off\n <span style="color: #000000; font-weight: bold;">fi</span>\n<span style="color: #7a0874; font-weight: bold;">}</span>\n\xa0\n<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #ff0000;">"$2"</span> = <span style="color: #ff0000;">"up"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n enable_disable_wifi\n<span style="color: #000000; font-weight: bold;">fi</span></pre></td></tr></tbody></table></div>\n\n<p>Unplug the ethernet connection, start wifi, and then plug the ethernet connection back in. Once NetworkManager fully connects (DHCP lease obtained, connectivity check passes), the wireless LAN should shut off automatically.</p>\n<p>The post <a href="https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/" rel="nofollow">Restoring wireless and Bluetooth state after reboot in Fedora 22</a> appeared first on <a href="https://major.io" rel="nofollow">major.io</a>.</p></div>', 'title': 'Restoring wireless and Bluetooth state after reboot in Fedora 22', 'date': <GDateTime at 0x5606cd406060>, 'author_homepage': 'https://major.io', 'url': 'https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/', 'is_read': False, 'author_email': None}, {'fullname': 'This week in Fedora', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <div id="activities" class="section">\n<h2>Activities</h2>\n<table border="1" class="docutils"><colgroup><col width="42%"/><col width="15%"/><col width="42%"/></colgroup><thead valign="bottom"><tr><th class="head">Activities</th>\n<th class="head">Amount</th>\n<th class="head">Diff to previous week</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>503</td>\n<td>-01.95%</td>\n</tr><tr><td>Builds</td>\n<td>16382</td>\n<td>-14.23%</td>\n</tr><tr><td>Copr build completed</td>\n<td>3913</td>\n<td>-07.67%</td>\n</tr><tr><td>Copr build started</td>\n<td>3932</td>\n<td>-09.73%</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>550</td>\n<td>+81.52%</td>\n</tr><tr><td>FAS user created</td>\n<td>112</td>\n<td>+27.27%</td>\n</tr><tr><td>Meeting completed</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>Meeting started</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>New packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Posts on the planet</td>\n<td>67</td>\n<td>+34.00%</td>\n</tr><tr><td>Retired packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Updates to stable</td>\n<td>244</td>\n<td>-33.33%</td>\n</tr><tr><td>Updates to testing</td>\n<td>448</td>\n<td>+00.22%</td>\n</tr></tbody></table></div>\n<div id="top-contributors-of-the-week" class="section">\n<h2>Top contributors of the week</h2>\n<table border="1" class="docutils"><colgroup><col width="31%"/><col width="69%"/></colgroup><thead valign="bottom"><tr><th class="head">Activites</th>\n<th class="head">Contributors</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>kelvar81 (8), binaryop (6), itamarjp (6)</td>\n</tr><tr><td>Builds</td>\n<td>pbrobinson (6237), sharkcz (3578), karsten (2819)</td>\n</tr><tr><td>Copr build completed</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Copr build started</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>jkurik (41), adamwill (33), fedoradummy (28)</td>\n</tr><tr><td>Meeting completed</td>\n<td>nirik (10), dgilmore (8), danofsatx (5)</td>\n</tr><tr><td>Meeting started</td>\n<td>decause (2), dgilmore (2), nirik (2)</td>\n</tr><tr><td>New packages</td>\n<td>\xa0</td>\n</tr><tr><td>Posts on the planet</td>\n<td>adamwill (8), admin (5), johe (3)</td>\n</tr><tr><td>Retired packages</td>\n<td>\xa0</td>\n</tr><tr><td>Updates to stable</td>\n<td>siwinski (45), hguemar (19), remi (18)</td>\n</tr><tr><td>Updates to testing</td>\n<td>remi (36), raveit65 (24), orion (20)</td>\n</tr></tbody></table></div></div>', 'title': 'Activities from Mon, 13 Jul 2015 to Sun, 19 Jul 2015', 'date': <GDateTime at 0x5606cd415600>, 'author_homepage': 'http://thisweekinfedora.org', 'url': 'http://thisweekinfedora.org/posts/2015_07_19.html', 'is_read': False, 'author_email': None}, {'fullname': 'dustymabe', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <h1 id="history">History</h1>\n<p>In <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> of this series I discussed why I desired a computer setup where I can do full system snapshots so I could seamlessly roll back at will. I also gave an overview of how I went about setting up a system so it could take advantage of <code>BTRFS</code> and <code>snapper</code> to do full system snapshotting and recovery. In this final post of the series I will give an overview of how to get <code>snapper</code> installed and configured on the system and walk through using it to do a rollback.</p>\n<h1 id="installing-and-configuring-snapper">Installing and Configuring Snapper</h1>\n<p>First things first, as part of this whole setup I want to be able to tell how much space each one of my snapshots are taking up. I covered how to do this in a <a href="http://dustymabe.com/2013/09/22/btrfs-how-big-are-my-snapshots/">previous post</a>, but the way you do it is by enabled <code>quota</code> on the <code>BTRFS</code> filesystem:</p>\n<pre><code>[root@localhost ~]# btrfs quota enable / \n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\n[root@localhost ~]# btrfs qgroup show /\nWARNING: Rescan is running, qgroup data may be incorrect\nqgroupid rfer excl \n-------- ---- ---- \n0/5 975.90MiB 975.90MiB \n0/258 16.00KiB 16.00KiB</code></pre>\n<p>You can see from the output that we currently have two subvolumes. One of them is the <em>root subvolume</em> while the other is a subvolume automatically created by <code>systemd</code> for <code>systemd-nspawn</code> container images.</p>\n<p>Now that we have quota enabled let\'s get <code>snapper</code> installed and configured:</p>\n<pre><code>[root@localhost ~]# dnf install -y snapper\n...\nComplete!\n[root@localhost ~]# snapper --config=root create-config /\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \n[root@localhost ~]# snapper list-configs\nConfig | Subvolume\n-------+----------\nroot | / \n[root@localhost ~]#\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 83 top level 5 path .snapshots</code></pre>\n<p>So we used the <code>snapper</code> command to create a configuration for <code>BTRFS</code> filesystem mounted at <code>/</code>. As part of this process we can see from the <code>btrfs subvolume list /</code> command that <code>snapper</code> also created a <code>.snapshots</code> subvolume. This subvolume will be used to house the <code>COW</code> snapshots that are taken of the system.</p>\n<p>The next thing we want to do is add an entry to <code>fstab</code> to make it so that regardless of what subvolume we are actually booted into we will always be able to view the <code>.snapshots</code> subvolume and all nested subvolumes (snapshots):</p>\n<pre><code>[root@localhost ~]# echo \'/dev/vgroot/lvroot /.snapshots btrfs subvol=.snapshots 0 0\' &gt;&gt; /etc/fstab</code></pre>\n<h1 id="taking-snapshots">Taking Snapshots</h1>\n<p>OK, now that we have snapper installed and the <code>.snapshots</code> subvolume in <code>/etc/fstab</code> we can start creating snapshots:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 5 (FS_TREE)\n[root@localhost ~]# snapper create --description "BigBang"\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang |\n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 90 top level 5 path .snapshots\nID 261 gen 88 top level 260 path .snapshots/1/snapshot\n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/1/snapshot/\nbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var</code></pre>\n<p>We made our first snapshot called <strong>BigBang</strong> and then ran a <code>btrfs subvolume list /</code> to view that a new snapshot was actually created. Notice at the top of the output of the sections that we ran a <code>btrfs subvolume get-default /</code>. This outputs what the currently set <em>default subvolume</em> is for the <code>BTRFS</code> filesystem. Right now we are booted into the <em>root subvolume</em> but that will change as soon as we decide we want to use one of the snapshots for rollback.</p>\n<p>Since we took a snapshot let\'s go ahead and make some changes to the system:</p>\n<pre><code>[root@localhost ~]# dnf install -y htop\n[root@localhost ~]# rpm -q htop\nhtop-1.0.3-4.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# snapper status 1..0 | grep htop\n+..... /usr/bin/htop\n+..... /usr/share/doc/htop\n+..... /usr/share/doc/htop/AUTHORS\n+..... /usr/share/doc/htop/COPYING\n+..... /usr/share/doc/htop/ChangeLog\n+..... /usr/share/doc/htop/README\n+..... /usr/share/man/man1/htop.1.gz\n+..... /usr/share/pixmaps/htop.png\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_data\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_type\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/command_line\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/from_repo\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/installed_by\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/reason\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/releasever</code></pre>\n<p>So from this we installed <code>htop</code> and then compared the current running system (<code>0</code>) with snapshot <code>1</code>.</p>\n<h1 id="rolling-back">Rolling Back</h1>\n<p>Now that we have taken a previous snapshot and have since made a change to the system we can use the <code>snapper rollback</code> functionality to get back to the state the system was in before we made the change. Let\'s do the rollback to get back to the snapshot <code>1</code> <strong>BigBang</strong> state:</p>\n<pre><code>[root@localhost ~]# snapper rollback 1\nCreating read-only snapshot of current system. (Snapshot 2.)\nCreating read-write snapshot of snapshot 1. (Snapshot 3.)\nSetting default subvolume to snapshot 3.\n[root@localhost ~]# reboot</code></pre>\n<p>As part of the rollback process you specify to <code>snapper</code> which snapshot you want to go back to. It then creates a read-only snapshot of the current system (in case you change your mind and want to get back to where you currently are) and then a new read-write subvolume based on the snapshot you specified to go back to. It then sets the <em>default subvolume</em> to be the newly created read-write subvolume it just created. After a reboot you will be booted into the new read-write subvolume and your state should be exactly as it was at the time you made the original snapshot.</p>\n<p>In our case, after reboot we should now be booted into snapshot 3 as indicated by the output of the <code>snapper rollback</code> command above and we should be able to inspect information about all of the snapshots on the system:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 263 gen 104 top level 260 path .snapshots/3/snapshot\n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | | \n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/\n1 2 3\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 100 top level 5 path .snapshots\nID 261 gen 98 top level 260 path .snapshots/1/snapshot\nID 262 gen 97 top level 260 path .snapshots/2/snapshot\nID 263 gen 108 top level 260 path .snapshots/3/snapshot</code></pre>\n<p>And the big test is to see if the change we made to the system was actually reverted:</p>\n<pre><code>[root@localhost ~]# rpm -q htop\npackage htop is not installed</code></pre>\n<p>Bliss!!</p>\n<p>Now in my case I like to have more descriptive notes on my snapshots so I\'ll go back now and give some notes for snapshots 2 and 3:</p>\n<pre><code>[root@localhost ~]# snapper modify --description "installed htop" 2\n[root@localhost ~]# snapper modify --description "rollback to 1 - read/write" 3 \n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+----------------------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | installed htop | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | rollback to 1 - read/write |</code></pre>\n<p>We can also see how much space (shared and exclusive each of the snapshots are taking up:</p>\n<pre><code>[root@localhost ~]# btrfs qgroup show / \nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 2.60MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.08GiB 18.91MiB</code></pre>\n<p>Now that is useful info so you can know how much space you will be recovering when you delete snapshots in the future.</p>\n<h1 id="updating-the-kernel">Updating The Kernel</h1>\n<p>I mentioned in <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> that I had to get a special rebuild of <code>GRUB</code> with some patches from the <code>SUSE</code> guys in order to get booting from the default subvolume to work. This was all needed so that I can update the kernel as normal and have the <code>GRUB</code> files that get used be the ones that are in the actual subvolume I am currently using. So let\'s test it out by doing a full system update (including a kernel update):</p>\n<pre><code>[root@localhost ~]# dnf update -y\n...\nInstall 8 Packages\nUpgrade 173 Packages\n...\nComplete!\n[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# btrfs qgroup show /\nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 11.96MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.19GiB 444.35MiB</code></pre>\n<p>So we did a full system upgrade that upgraded 173 packages and installed a few others. We can see now that the current subvolume (snapshot <code>3</code> with ID <code>263</code>) now has 444MiB of exclusive data. This makes sense since all of the other snapshots were from before the full system update.</p>\n<p>Let\'s create a new snapshot that represents the state of the system right after we did the full system update and then reboot:</p>\n<pre><code>[root@localhost ~]# snapper create --description "full system upgrade"\n[root@localhost ~]# reboot</code></pre>\n<p>After reboot we can now check to see if we have properly booted the recently installed kernel:</p>\n<pre><code>[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# uname -r\n4.0.7-300.fc22.x86_64</code></pre>\n<p>Bliss again. Yay! And I\'m Done.</p>\n<p>Enjoy!</p>\n<p>Dusty</p></div>', 'title': 'Fedora BTRFS+Snapper PART 2: Full System Snapshot/Rollback', 'date': <GDateTime at 0x5606cd4162c0>, 'author_homepage': 'http://dustymabe.com', 'url': 'http://dustymabe.com/2015/07/19/fedora-btrfssnapper-part-2-full-system-snapshotrollback/', 'is_read': False, 'author_email': None}, {'fullname': 'Jamie Nguyen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://jamielinux.fedorapeople.org/avatar.png" alt="" style="float: right;"/>\n <p><a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> is an Ansible playbook I created to make it easy to\ndeploy Discourse without Docker. It supports several distributions, including\nCentOS, Debian, Fedora and Ubuntu. Testing and feedback are very welcome!</p>\n<p><a href="http://www.discourse.org/" class="reference external">Discourse</a> is an open source discussion forum application. The Discourse team\nonly supports installation via their offical Docker image. This is a sensible\nmove as the production environment can be kept more consistent across all\ninstallations, making it harder for administrators to break their site with a\nconfiguration error.</p>\n<p>However, some people may want to avoid using Docker. Perhaps you already manage\nyour servers with Ansible, or you want more flexibility over your production\nenvironment. Perhaps you need more secure isolation (eg, hardware\nvirtualization) than Docker can provide (as <a href="https://opensource.com/business/14/7/docker-security-selinux" class="reference external">containers do not contain</a>). If so, you\nmight want to give <a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> a try.</p></div>', 'title': 'Easily install Discourse using Ansible', 'date': <GDateTime at 0x5606cd419740>, 'author_homepage': 'https://jamielinux.com/blog/', 'url': 'https://jamielinux.com/blog/easily-install-discourse-using-ansible/', 'is_read': False, 'author_email': None}, {'fullname': 'Daniel.Pocock', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.debian.org/heads/pocock.png" alt="" style="float: right;"/>\n <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><a href="https://fedoraproject.org/wiki/User:Zoltanh721">Zoltan (Zoltanh721)</a> recently <a href="http://wordpress-zoltanh721.rhcloud.com/?p=24">blogged about WebRTC for the Fedora community and Fedora desktop</a>.</p>\n<p><a href="https://fedrtc.org">https://fedrtc.org</a> has been running for a while now and this has given many people a chance to get a taste of regular SIP and WebRTC-based SIP. As suggested in Zoltan\'s blog, it has convenient integration with Fedora SSO and as the <a href="http://danielpocock.com/free-and-open-webrtc-for-the-fedora-community">source code is available</a>, people are welcome to see how it was built and use it for other projects.</p>\n<h3>Issues with Chrome/Chromium on Linux</h3>\n<p>If you tried any of <a href="https://fedrtc.org">FedRTC.org</a>, <a href="https://rtc.debian.org">rtc.debian.org</a> or <a href="https://meet.jit.si">meet.jit.si</a> using Chrome/Chromium on Linux, you may have found that the call appears to be connected but there is no media. This is a <a href="https://code.google.com/p/chromium/issues/detail?id=501318">bug</a> and the Chromium developers are on to it. You can work around this by trying an older version of Chromium (it still works with v37 from Debian wheezy) or Firefox/Iceweasel.</p>\n<h3>WebRTC is not everything</h3>\n<p><a href="http://danielpocock.com/tags/webrtc">WebRTC</a> offers many great possibilities for people to quickly build and deploy RTC services to a large user base, especially when using components like <a href="http://jscommunicator.org">JSCommunicator</a> or <a href="http://drucall.org">the DruCall WebRTC plugin for Drupal</a>.</p>\n<p>However, it is not a silver bullet. For example, there remain concerns about how to receive incoming calls. How do you know which browser tab is ringing when you have many tabs open at once? This may require greater browser/desktop integration and that has security implications for JavaScript. Whether users on battery-powered devices can really leave JavaScript running for extended periods of time waiting for incoming calls is another issue, especially when you consider that many web sites contain some JavaScript that is less than efficient.</p>\n<p>Native applications and mobile apps like <a href="http://lumicall.org">Lumicall</a> continue to offer the most optimized solution for each platform although WebRTC currently offers the most convenient way for people to place a <em>Call me</em> link on their web site or portal.</p>\n<h3>Deploy it yourself</h3>\n<p>The <a href="http://rtcquickstart.org">RTC Quick Start Guide</a> offers step-by-step instructions and a thorough discussion of the architecture for people to start deploying RTC and WebRTC on their own servers using standard packages on many of the most popular Linux distributions, including Debian, Ubuntu, RHEL, CentOS and Fedora.</p>\n</div></div></div></div>', 'title': 'RTC status on Debian, Ubuntu and Fedora', 'date': <GDateTime at 0x5606cd403880>, 'author_homepage': 'http://danielpocock.com/tags/fedora', 'url': 'http://danielpocock.com/rtc-status-on-debian-ubuntu-and-fedora-july-2015', 'is_read': False, 'author_email': None}]
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('Adam Šamalík'), returned Adam Šamalík
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16bdb40 (uninitialized at 0x0)>, {'fullname': 'Adam Šamalík', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://pbs.twimg.com/profile_images/505677536232091648/N1HMnx1h_400x400.jpeg" alt="" style="float: right;"/>\n <p>As in the last year, July, for some reason, happened to be a great time to post some news about our <a href="http://copr.fedoraproject.org">Copr Build Service</a>. At this time, it’s about integrating Copr with:</p>\n<ul>\n<li><a href="http://www.patternfly.org">Patternfly</a> – an open interface project</li>\n<li><a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a remote Git repository designed to hold RPM package sources</li>\n</ul>\n<p><em>If you can’t wait to see it, you can check <a href="http://copr-fe-dev.cloud.fedoraproject.org/">the development server</a> that is hopefully running on <a href="http://copr-fe-dev.cloud.fedoraproject.org/">copr-fe-dev.cloud.fedoraproject.org</a>. But please, remember, it’s a development server – so all the projects built here are a subject of deletion, destruction and all kinds of randomization without notice.</em></p>\n<h3>Dist Git for Copr</h3>\n<p>It all started with a need of <strong>uploading sources</strong> to the Copr itself – as the only way of building your package was to provide a URL pointing to it. That, however, required all users to have their own public file storage.</p>\n<p>We decided to go the Fedora way and use <a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a combination of git repository to store spec files, lookaside cache to store sources, and Gitolite to manage access permissions. Each package will be stored in a repo named as ‘username/project/package’. Each repo will contain branches that represent a target platform. For example: ‘f22′ for Fedora 22, ‘epel7′ for Epel for Centos 7, etc.</p>\n<p><img src="https://github.com/release-engineering/dist-git/raw/master/images/storage.png" alt="" height="1150" class="aligncenter" width="1592"/></p>\n<p>It will be gradually deployed in production. The first step is to <strong>enable users to upload their .src.rpm</strong> files into Copr. At this step, Dist Git will be used as a storage only. Direct access to the repositories will come afterwards.</p>\n<h3>New User Interface\xa0 Patternfly</h3>\n<p>Enabling Dist Git required some changes to the user interface as well. We didn’t use any framework, that would help us to easily create new elements in the UI. Instead, we had a custom CSS that received new lines of code with each change. As you can imagine, each change took a bit longer than desired, the CSS became messy, and yes, the interface itself became messy as well. At this point, I decided that we need to do a step forward and we finally agreed to rewrite the user interface to <a href="https://www.patternfly.org/">Patternfly</a>! Yay!</p>\n<h4>The Old Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1-819x1024.png" alt="The old Copr interface" height="750" class="alignleft wp-image-181 size-large" width="600"/></a></p>\n<h4>The New Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1-1024x872.png" alt="The new Copr interface" height="511" class="alignleft wp-image-182 size-large" width="600"/></a></p>\n<h3>We need your feedback!</h3>\n<p>I would like to make Copr as friendly as possible. If you want to help me with that, please provide a feedback as a comment. Do you like it? Do you hate it? Is there anything you miss in the interface? Your feedback is much appreciated!</p></div>', 'title': 'Copr, Dist Git and Patternfly', 'date': <GDateTime at 0x5606cd417ec0>, 'author_homepage': 'http://blog.samalik.com', 'url': 'http://blog.samalik.com/copr-dist-git-and-patternfly/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'Adam Šamalík', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://pbs.twimg.com/profile_images/505677536232091648/N1HMnx1h_400x400.jpeg" alt="" style="float: right;"/>\n <p>As in the last year, July, for some reason, happened to be a great time to post some news about our <a href="http://copr.fedoraproject.org">Copr Build Service</a>. At this time, it’s about integrating Copr with:</p>\n<ul>\n<li><a href="http://www.patternfly.org">Patternfly</a> – an open interface project</li>\n<li><a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a remote Git repository designed to hold RPM package sources</li>\n</ul>\n<p><em>If you can’t wait to see it, you can check <a href="http://copr-fe-dev.cloud.fedoraproject.org/">the development server</a> that is hopefully running on <a href="http://copr-fe-dev.cloud.fedoraproject.org/">copr-fe-dev.cloud.fedoraproject.org</a>. But please, remember, it’s a development server – so all the projects built here are a subject of deletion, destruction and all kinds of randomization without notice.</em></p>\n<h3>Dist Git for Copr</h3>\n<p>It all started with a need of <strong>uploading sources</strong> to the Copr itself – as the only way of building your package was to provide a URL pointing to it. That, however, required all users to have their own public file storage.</p>\n<p>We decided to go the Fedora way and use <a href="https://github.com/release-engineering/dist-git">Dist Git</a> – a combination of git repository to store spec files, lookaside cache to store sources, and Gitolite to manage access permissions. Each package will be stored in a repo named as ‘username/project/package’. Each repo will contain branches that represent a target platform. For example: ‘f22′ for Fedora 22, ‘epel7′ for Epel for Centos 7, etc.</p>\n<p><img src="https://github.com/release-engineering/dist-git/raw/master/images/storage.png" alt="" height="1150" class="aligncenter" width="1592"/></p>\n<p>It will be gradually deployed in production. The first step is to <strong>enable users to upload their .src.rpm</strong> files into Copr. At this step, Dist Git will be used as a storage only. Direct access to the repositories will come afterwards.</p>\n<h3>New User Interface\xa0 Patternfly</h3>\n<p>Enabling Dist Git required some changes to the user interface as well. We didn’t use any framework, that would help us to easily create new elements in the UI. Instead, we had a custom CSS that received new lines of code with each change. As you can imagine, each change took a bit longer than desired, the CSS became messy, and yes, the interface itself became messy as well. At this point, I decided that we need to do a step forward and we finally agreed to rewrite the user interface to <a href="https://www.patternfly.org/">Patternfly</a>! Yay!</p>\n<h4>The Old Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/old-copr1-819x1024.png" alt="The old Copr interface" height="750" class="alignleft wp-image-181 size-large" width="600"/></a></p>\n<h4>The New Copr UI</h4>\n<p><a href="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1.png"><img src="https://blog-shaman.rhcloud.com/wp-content/uploads/2015/07/new-copr1-1024x872.png" alt="The new Copr interface" height="511" class="alignleft wp-image-182 size-large" width="600"/></a></p>\n<h3>We need your feedback!</h3>\n<p>I would like to make Copr as friendly as possible. If you want to help me with that, please provide a feedback as a comment. Do you like it? Do you hate it? Is there anything you miss in the interface? Your feedback is much appreciated!</p></div>', 'title': 'Copr, Dist Git and Patternfly', 'date': <GDateTime at 0x5606cd417ec0>, 'author_homepage': 'http://blog.samalik.com', 'url': 'http://blog.samalik.com/copr-dist-git-and-patternfly/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdaf8 (GtkFlowBox at 0x5606cd70eac0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('jzb'), returned jzb
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16bd798 (uninitialized at 0x0)>, {'fullname': 'jzb', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p><a href="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg"><img src="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg" alt="oscon-logo" height="125" class="alignleft size-full wp-image-191" width="125"/></a>Once again, time for the annual trek to Portland, Oregon for OSCON — perhaps for the last time!</p>\n<p>Next year, OSCON is going to be in Austin, TX — which seems like a bit of a mistake to me. Portland and OSCON go together like milk and cookies.</p>\n<p>If you’re going to be at OSCON, make sure to drop by <a href="http://community.redhat.com/blog/2015/07/open-cloud-day-rolls-into-oscon-2015/" target="_blank">Open Cloud Day on Tuesday</a>, and come by the Red Hat booth to say hello!</p></div>', 'title': 'Headed to OSCON', 'date': <GDateTime at 0x5606cd416240>, 'author_homepage': 'http://dissociatedpress.net', 'url': 'http://dissociatedpress.net/headed-to-oscon/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'jzb', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p><a href="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg"><img src="http://dissociatedpress.net/wp-content/uploads/2015/07/oscon-logo.jpg" alt="oscon-logo" height="125" class="alignleft size-full wp-image-191" width="125"/></a>Once again, time for the annual trek to Portland, Oregon for OSCON — perhaps for the last time!</p>\n<p>Next year, OSCON is going to be in Austin, TX — which seems like a bit of a mistake to me. Portland and OSCON go together like milk and cookies.</p>\n<p>If you’re going to be at OSCON, make sure to drop by <a href="http://community.redhat.com/blog/2015/07/open-cloud-day-rolls-into-oscon-2015/" target="_blank">Open Cloud Day on Tuesday</a>, and come by the Red Hat booth to say hello!</p></div>', 'title': 'Headed to OSCON', 'date': <GDateTime at 0x5606cd416240>, 'author_homepage': 'http://dissociatedpress.net', 'url': 'http://dissociatedpress.net/headed-to-oscon/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdaf8 (GtkFlowBox at 0x5606cd70eac0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('Niels de Vos'), returned Niels de Vos
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16bdd38 (uninitialized at 0x0)>, {'fullname': 'Niels de Vos', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://devos.fedorapeople.org/.unlisted/me-head-small.png" alt="" style="float: right;"/>\n <h2 id="release-notes-for-glusterfs-3-5-5"/>Packages for <a href="https://admin.fedoraproject.org/updates/FEDORA-2015-11468/glusterfs-3.5.5-2.fc21">Fedora 21 are available in updates-testing</a>, RPMs and <span style="font-family: &quot;Courier New&quot;,Courier,monospace;">.deb</span>s can be found on the <a href="http://download.gluster.org/pub/gluster/glusterfs/3.5/3.5.5/">main Gluster download site</a>.<br/><br/>This is a bugfix release. The <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.0.md">Release Notes for 3.5.0</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.1.md">3.5.1</a>, <a href="https://draft.blogger.com/null">3.5.2</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.3.md">3.5.3</a> and <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.4.md">3.5.4</a> contain a listing of all the new features that were added and bugs fixed in the GlusterFS 3.5 stable release.<br/> <h3 id="bugs-fixed-">Bugs Fixed:</h3><ul><li><a href="https://bugzilla.redhat.com/1166862">1166862</a>: rmtab file is a bottleneck when lot of clients are accessing a volume through NFS</li><li><a href="https://bugzilla.redhat.com/1217432">1217432</a>: DHT:Quota:- brick process crashed after deleting .glusterfs from backend</li><li><a href="https://bugzilla.redhat.com/1217433">1217433</a>: glusterfsd crashed after directory was removed from the mount point, while self-heal and rebalance were running on the volume</li><li><a href="https://bugzilla.redhat.com/1231641">1231641</a>: cli crashes when listing quota limits with xml output</li></ul><h3 id="known-issues-">Known Issues:</h3><ul><li>The following configuration changes are necessary for \'qemu\' and \'samba vfs plugin\' integration with libgfapi to work seamlessly:<br/> <ol><li><code>gluster volume set &lt;volname&gt; server.allow-insecure on</code></li><li>restarting the volume is necessary<br/> <pre><code> gluster volume stop &lt;volname&gt;<br/> gluster volume start &lt;volname&gt;<br/></code></pre></li><li>Edit <code>/etc/glusterfs/glusterd.vol</code> to contain this line:<br/> <pre><code> option rpc-auth-allow-insecure on<br/></code></pre></li><li>restarting glusterd is necessary<br/> <pre><code> service glusterd restart<br/></code></pre>More details are also documented in the Gluster Wiki on the <a href="http://www.gluster.org/community/documentation/index.php/Libgfapi_with_qemu_libvirt">Libgfapi with qemu libvirt</a> page.<br/> </li></ol></li><li>For Block Device translator based volumes open-behind translator at the client side needs to be disabled.<br/> <pre><code>gluster volume set &lt;volname&gt; performance.open-behind disabled<br/></code></pre></li><li>libgfapi clients calling <code>glfs_fini</code> before a successful <code>glfs_init</code> will cause the client to hang as reported <a href="http://lists.gnu.org/archive/html/gluster-devel/2014-04/msg00179.html">here</a>. The workaround is NOT to call <code>glfs_fini</code> for error cases encountered before a successful <code>glfs_init</code>. This is being tracked in <a href="https://bugzilla.redhat.com/1134050">Bug 1134050</a> for glusterfs-3.5 and <a href="https://bugzilla.redhat.com/1093594">Bug 1093594</a> for mainline.<br/> </li><li>If the <code>/var/run/gluster</code> directory does not exist enabling quota will likely fail (<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1117888">Bug 1117888</a>).<br/> </li></ul></div>', 'title': 'Another stable release, GlusterFS 3.5.5 is ready', 'date': <GDateTime at 0x5606cd404340>, 'author_homepage': 'http://blog.nixpanic.net/search/label/Fedora', 'url': 'http://blog.nixpanic.net/2015/07/another-stable-release-glusterfs-355-is.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'Niels de Vos', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://devos.fedorapeople.org/.unlisted/me-head-small.png" alt="" style="float: right;"/>\n <h2 id="release-notes-for-glusterfs-3-5-5"/>Packages for <a href="https://admin.fedoraproject.org/updates/FEDORA-2015-11468/glusterfs-3.5.5-2.fc21">Fedora 21 are available in updates-testing</a>, RPMs and <span style="font-family: &quot;Courier New&quot;,Courier,monospace;">.deb</span>s can be found on the <a href="http://download.gluster.org/pub/gluster/glusterfs/3.5/3.5.5/">main Gluster download site</a>.<br/><br/>This is a bugfix release. The <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.0.md">Release Notes for 3.5.0</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.1.md">3.5.1</a>, <a href="https://draft.blogger.com/null">3.5.2</a>, <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.3.md">3.5.3</a> and <a href="https://github.com/gluster/glusterfs/blob/release-3.5/doc/release-notes/3.5.4.md">3.5.4</a> contain a listing of all the new features that were added and bugs fixed in the GlusterFS 3.5 stable release.<br/> <h3 id="bugs-fixed-">Bugs Fixed:</h3><ul><li><a href="https://bugzilla.redhat.com/1166862">1166862</a>: rmtab file is a bottleneck when lot of clients are accessing a volume through NFS</li><li><a href="https://bugzilla.redhat.com/1217432">1217432</a>: DHT:Quota:- brick process crashed after deleting .glusterfs from backend</li><li><a href="https://bugzilla.redhat.com/1217433">1217433</a>: glusterfsd crashed after directory was removed from the mount point, while self-heal and rebalance were running on the volume</li><li><a href="https://bugzilla.redhat.com/1231641">1231641</a>: cli crashes when listing quota limits with xml output</li></ul><h3 id="known-issues-">Known Issues:</h3><ul><li>The following configuration changes are necessary for \'qemu\' and \'samba vfs plugin\' integration with libgfapi to work seamlessly:<br/> <ol><li><code>gluster volume set &lt;volname&gt; server.allow-insecure on</code></li><li>restarting the volume is necessary<br/> <pre><code> gluster volume stop &lt;volname&gt;<br/> gluster volume start &lt;volname&gt;<br/></code></pre></li><li>Edit <code>/etc/glusterfs/glusterd.vol</code> to contain this line:<br/> <pre><code> option rpc-auth-allow-insecure on<br/></code></pre></li><li>restarting glusterd is necessary<br/> <pre><code> service glusterd restart<br/></code></pre>More details are also documented in the Gluster Wiki on the <a href="http://www.gluster.org/community/documentation/index.php/Libgfapi_with_qemu_libvirt">Libgfapi with qemu libvirt</a> page.<br/> </li></ol></li><li>For Block Device translator based volumes open-behind translator at the client side needs to be disabled.<br/> <pre><code>gluster volume set &lt;volname&gt; performance.open-behind disabled<br/></code></pre></li><li>libgfapi clients calling <code>glfs_fini</code> before a successful <code>glfs_init</code> will cause the client to hang as reported <a href="http://lists.gnu.org/archive/html/gluster-devel/2014-04/msg00179.html">here</a>. The workaround is NOT to call <code>glfs_fini</code> for error cases encountered before a successful <code>glfs_init</code>. This is being tracked in <a href="https://bugzilla.redhat.com/1134050">Bug 1134050</a> for glusterfs-3.5 and <a href="https://bugzilla.redhat.com/1093594">Bug 1093594</a> for mainline.<br/> </li><li>If the <code>/var/run/gluster</code> directory does not exist enabling quota will likely fail (<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1117888">Bug 1117888</a>).<br/> </li></ul></div>', 'title': 'Another stable release, GlusterFS 3.5.5 is ready', 'date': <GDateTime at 0x5606cd404340>, 'author_homepage': 'http://blog.nixpanic.net/search/label/Fedora', 'url': 'http://blog.nixpanic.net/2015/07/another-stable-release-glusterfs-355-is.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}, <FlowBox object at 0x7f7fa16bdaf8 (GtkFlowBox at 0x5606cd70eac0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('Jörg Stephan'), returned Jörg Stephan
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16bdd80 (uninitialized at 0x0)>, {'fullname': 'Jörg Stephan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <a href="http://sendmespamids.blogspot.com/2015/07/encoded-bot-execution-from-16220914224.html?spref=bl">SendMeSpam: Encoded bot execution from 162.209.14.224 includin...</a>: 2015-07-19 16:28:52 Source IP: 162.209.14.224 Country: US RiskScore: 1 Malware: [] POST //%63%67%69%2d%62%69%6e/%70%68%70?%2d%64+%61%6c%6c%...<img src="http://feeds.feedburner.com/~r/LinuxserverDerRest/~4/kolnxm8xS0Q" alt="" height="1" width="1"/></div>', 'title': 'SendMeSpam: Encoded bot execution from 162.209.14.224 includin...', 'date': <GDateTime at 0x5606cd4132a0>, 'author_homepage': 'http://amelinux.blogspot.com/', 'url': 'http://feedproxy.google.com/~r/LinuxserverDerRest/~3/kolnxm8xS0Q/sendmespam-encoded-bot-execution-from.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'Jörg Stephan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <a href="http://sendmespamids.blogspot.com/2015/07/encoded-bot-execution-from-16220914224.html?spref=bl">SendMeSpam: Encoded bot execution from 162.209.14.224 includin...</a>: 2015-07-19 16:28:52 Source IP: 162.209.14.224 Country: US RiskScore: 1 Malware: [] POST //%63%67%69%2d%62%69%6e/%70%68%70?%2d%64+%61%6c%6c%...<img src="http://feeds.feedburner.com/~r/LinuxserverDerRest/~4/kolnxm8xS0Q" alt="" height="1" width="1"/></div>', 'title': 'SendMeSpam: Encoded bot execution from 162.209.14.224 includin...', 'date': <GDateTime at 0x5606cd4132a0>, 'author_homepage': 'http://amelinux.blogspot.com/', 'url': 'http://feedproxy.google.com/~r/LinuxserverDerRest/~3/kolnxm8xS0Q/sendmespam-encoded-bot-execution-from.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}, <FlowBox object at 0x7f7fa16bdaf8 (GtkFlowBox at 0x5606cd70eac0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('sonalkr132'), returned sonalkr132
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16bddc8 (uninitialized at 0x0)>, {'fullname': 'sonalkr132', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p>Project: <a href="https://github.com/glittergallery/GlitterGallery" target="_blank">GlitterGallery</a></p>\n<p>We had a minor set back with implementation of git protocols. I worked on git https protocol but later I found out that <a href="http://sparkleshare.org" target="_blank">sparkleshare</a>\xa0only supports ssh protocol. Until now we were planning to host on <a href="http://openshift.redhat.com" target="_blank">openshift</a>.\xa0I needed access of ~/.ssh/authorized_keys file for git ssh to work but OS doesn’t give away that access. Time to move to VPS. <a href="https://fedoraproject.org/wiki/User:Kevin">Kevin</a>\xa0got me set up with one and <a href="https://fedoraproject.org/wiki/User:Pingou" target="_blank">Pingou</a>\xa0helped me figure out a few details.</p>\n<p>First I needed to make changes to our web interface so that users can add their public key to their profiles. This would also mean addition of a keys model and generation of fingerprint for keys. Next thing is validation of keys when push or pull is made over ssh. This involves two steps namely, authentication and authorization. OpenSSH server handles the authentication part and for authorization I have set up git shell, which makes an api call to glittergallery to check user access. Besides authorization git shell also limits ssh access to git related commands.</p>\n<p>Git shell I am using is just a fork of <a href="https://github.com/gitlabhq/gitlab-shell" target="_blank">gitlab-shell</a>. I am hoping that I won’t need to make any changes to it, however we won’t be supporting all the features (git-annex and git-lfs) of gitlab-shell yet.</p><br/> <a href="http://feeds.wordpress.com/1.0/gocomments/chasingcrazydreams.wordpress.com/49/" rel="nofollow"><img src="http://feeds.wordpress.com/1.0/comments/chasingcrazydreams.wordpress.com/49/" alt="" border="0"/></a> <img src="https://pixel.wp.com/b.gif?host=chasingcrazydreams.wordpress.com&amp;blog=87948641&amp;post=49&amp;subd=chasingcrazydreams&amp;ref=&amp;feed=1" alt="" height="1" border="0" width="1"/></div>', 'title': 'Git over ssh', 'date': <GDateTime at 0x5606cd3f79a0>, 'author_homepage': 'https://chasingcrazydreams.wordpress.com', 'url': 'https://chasingcrazydreams.wordpress.com/2015/07/19/git-over-ssh/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'sonalkr132', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <p>Project: <a href="https://github.com/glittergallery/GlitterGallery" target="_blank">GlitterGallery</a></p>\n<p>We had a minor set back with implementation of git protocols. I worked on git https protocol but later I found out that <a href="http://sparkleshare.org" target="_blank">sparkleshare</a>\xa0only supports ssh protocol. Until now we were planning to host on <a href="http://openshift.redhat.com" target="_blank">openshift</a>.\xa0I needed access of ~/.ssh/authorized_keys file for git ssh to work but OS doesn’t give away that access. Time to move to VPS. <a href="https://fedoraproject.org/wiki/User:Kevin">Kevin</a>\xa0got me set up with one and <a href="https://fedoraproject.org/wiki/User:Pingou" target="_blank">Pingou</a>\xa0helped me figure out a few details.</p>\n<p>First I needed to make changes to our web interface so that users can add their public key to their profiles. This would also mean addition of a keys model and generation of fingerprint for keys. Next thing is validation of keys when push or pull is made over ssh. This involves two steps namely, authentication and authorization. OpenSSH server handles the authentication part and for authorization I have set up git shell, which makes an api call to glittergallery to check user access. Besides authorization git shell also limits ssh access to git related commands.</p>\n<p>Git shell I am using is just a fork of <a href="https://github.com/gitlabhq/gitlab-shell" target="_blank">gitlab-shell</a>. I am hoping that I won’t need to make any changes to it, however we won’t be supporting all the features (git-annex and git-lfs) of gitlab-shell yet.</p><br/> <a href="http://feeds.wordpress.com/1.0/gocomments/chasingcrazydreams.wordpress.com/49/" rel="nofollow"><img src="http://feeds.wordpress.com/1.0/comments/chasingcrazydreams.wordpress.com/49/" alt="" border="0"/></a> <img src="https://pixel.wp.com/b.gif?host=chasingcrazydreams.wordpress.com&amp;blog=87948641&amp;post=49&amp;subd=chasingcrazydreams&amp;ref=&amp;feed=1" alt="" height="1" border="0" width="1"/></div>', 'title': 'Git over ssh', 'date': <GDateTime at 0x5606cd3f79a0>, 'author_homepage': 'https://chasingcrazydreams.wordpress.com', 'url': 'https://chasingcrazydreams.wordpress.com/2015/07/19/git-over-ssh/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdaf8 (GtkFlowBox at 0x5606cd70eac0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('Major Hayden'), returned Major Hayden
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16bde10 (uninitialized at 0x0)>, {'fullname': 'Major Hayden', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://major.io/wp-content/uploads/2014/03/cropped-hayden_major_01_bw.jpg" alt="" style="float: right;"/>\n <p><a href="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1.jpg"><img src="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1-300x212.jpg" alt="Thinkpad X1 Carbon 3rd gen" height="212" class="alignright size-medium wp-image-5452" width="300"/></a>My upgrade to Fedora 22 on the ThinkPad X1 Carbon was fairly uneventful and the hiccups were minor. One of the more annoying items that I’ve been struggling with for quite some time is how to boot up with the wireless LAN and Bluetooth disabled by default. Restoring wireless and Bluetooth state between reboots is normally handled quite well in Fedora.</p>\n<p>In Fedora 21, NetworkManager saved my settings between reboots. For example, if I shut down with wifi off and Bluetooth on, the laptop would boot up later with wifi off and Bluetooth on. This wasn’t working well in Fedora 22: both the wifi and Bluetooth were always enabled by default.</p>\n<h3>Digging into rfkill</h3>\n<p>I remembered <a href="https://wireless.wiki.kernel.org/en/users/documentation/rfkill">rfkill</a> and began testing out some commands. It detected that I had disabled both devices via NetworkManager (soft):</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html">$ rfkill list\n0: tpacpi_bluetooth_sw: Bluetooth\n Soft blocked: yes\n Hard blocked: no\n2: phy0: Wireless LAN\n Soft blocked: yes\n Hard blocked: no</pre></td></tr></tbody></table></div>\n\n<p>It looked like systemd has some hooks already configured to manage rfkill via the <a href="http://www.freedesktop.org/software/systemd/man/systemd-rfkill@.service.html">systemd-rfkill</a> service. However, something strange happened when I tried to start the service:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># systemctl start systemd-rfkill@0\nFailed to start systemd-rfkill@0.service: Unit systemd-rfkill@0.service is masked.</pre></td></tr></tbody></table></div>\n\n<p>Well, that’s certainly weird. While looking into why it’s masked, I found an empty file in <code>/etc/systemd</code>:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># ls -al /etc/systemd/system/systemd-rfkill@.service \n-rwxr-xr-x. 1 root root 0 May 11 16:36 /etc/systemd/system/systemd-rfkill@.service</pre></td></tr></tbody></table></div>\n\n<p>I don’t remember making that file. Did something else put it there?</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># rpm -qf /etc/systemd/system/systemd-rfkill@.service\ntlp-0.7-4.fc22.noarch</pre></td></tr></tbody></table></div>\n\n<p>Ah, <a href="http://linrunner.de/en/tlp/tlp.html">tlp</a>!</p>\n<h3>Configuring tlp</h3>\n<p>I looked in tlp’s configuration file in <code>/etc/default/tlp</code> and found a few helpful configuration items:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;"># Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown</span>\n<span style="color: #666666; font-style: italic;"># on system startup: 0=disable, 1=enable.</span>\n<span style="color: #666666; font-style: italic;"># Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below</span>\n<span style="color: #666666; font-style: italic;"># are ignored when this is enabled!</span>\n<span style="color: #007800;">RESTORE_DEVICE_STATE_ON_STARTUP</span>=<span style="color: #000000;">0</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_STARTUP="wifi"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (workaround for devices that are blocking shutdown).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (to prevent other operating systems from missing radios).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_SHUTDOWN="wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on AC: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_AC="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery when not in use (not connected):</span>\n<span style="color: #666666; font-style: italic;"># bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>So tlp’s default configuration doesn’t restore device state <b>and</b> it masked systemd’s rfkill service. I adjusted one line in tlp’s configuration and rebooted:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #007800;">DEVICES_TO_DISABLE_ON_STARTUP</span>=<span style="color: #ff0000;">"bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>After the reboot, both the wifi and Bluetooth functionality were shut off! That’s exactly what I needed.</p>\n<h3>Extra credit</h3>\n<p>Thanks to a coworker, I was able to make a NetworkManager script to automatically shut off the wireless LAN whenever I connected to a network via ethernet. This is typically what I do when coming back from an in-person meeting to my desk (where I have ethernet connectivity).</p>\n<p>If you want the same automation, just drop this script into <code>/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh</code> and make it executable:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>\n<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LC_ALL</span>=C\n\xa0\nenable_disable_wifi <span style="color: #7a0874; font-weight: bold;">(</span><span style="color: #7a0874; font-weight: bold;">)</span>\n<span style="color: #7a0874; font-weight: bold;">{</span>\n <span style="color: #007800;">result</span>=$<span style="color: #7a0874; font-weight: bold;">(</span>nmcli dev <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">"ethernet"</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-w</span> <span style="color: #ff0000;">"connected"</span><span style="color: #7a0874; font-weight: bold;">)</span>\n <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">"<span style="color: #007800;">$result</span>"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n nmcli radio wifi off\n <span style="color: #000000; font-weight: bold;">fi</span>\n<span style="color: #7a0874; font-weight: bold;">}</span>\n\xa0\n<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #ff0000;">"$2"</span> = <span style="color: #ff0000;">"up"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n enable_disable_wifi\n<span style="color: #000000; font-weight: bold;">fi</span></pre></td></tr></tbody></table></div>\n\n<p>Unplug the ethernet connection, start wifi, and then plug the ethernet connection back in. Once NetworkManager fully connects (DHCP lease obtained, connectivity check passes), the wireless LAN should shut off automatically.</p>\n<p>The post <a href="https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/" rel="nofollow">Restoring wireless and Bluetooth state after reboot in Fedora 22</a> appeared first on <a href="https://major.io" rel="nofollow">major.io</a>.</p></div>', 'title': 'Restoring wireless and Bluetooth state after reboot in Fedora 22', 'date': <GDateTime at 0x5606cd406060>, 'author_homepage': 'https://major.io', 'url': 'https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'Major Hayden', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://major.io/wp-content/uploads/2014/03/cropped-hayden_major_01_bw.jpg" alt="" style="float: right;"/>\n <p><a href="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1.jpg"><img src="https://major.io/wp-content/uploads/2015/03/ThinkPad-Carbon-X1-300x212.jpg" alt="Thinkpad X1 Carbon 3rd gen" height="212" class="alignright size-medium wp-image-5452" width="300"/></a>My upgrade to Fedora 22 on the ThinkPad X1 Carbon was fairly uneventful and the hiccups were minor. One of the more annoying items that I’ve been struggling with for quite some time is how to boot up with the wireless LAN and Bluetooth disabled by default. Restoring wireless and Bluetooth state between reboots is normally handled quite well in Fedora.</p>\n<p>In Fedora 21, NetworkManager saved my settings between reboots. For example, if I shut down with wifi off and Bluetooth on, the laptop would boot up later with wifi off and Bluetooth on. This wasn’t working well in Fedora 22: both the wifi and Bluetooth were always enabled by default.</p>\n<h3>Digging into rfkill</h3>\n<p>I remembered <a href="https://wireless.wiki.kernel.org/en/users/documentation/rfkill">rfkill</a> and began testing out some commands. It detected that I had disabled both devices via NetworkManager (soft):</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html">$ rfkill list\n0: tpacpi_bluetooth_sw: Bluetooth\n Soft blocked: yes\n Hard blocked: no\n2: phy0: Wireless LAN\n Soft blocked: yes\n Hard blocked: no</pre></td></tr></tbody></table></div>\n\n<p>It looked like systemd has some hooks already configured to manage rfkill via the <a href="http://www.freedesktop.org/software/systemd/man/systemd-rfkill@.service.html">systemd-rfkill</a> service. However, something strange happened when I tried to start the service:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># systemctl start systemd-rfkill@0\nFailed to start systemd-rfkill@0.service: Unit systemd-rfkill@0.service is masked.</pre></td></tr></tbody></table></div>\n\n<p>Well, that’s certainly weird. While looking into why it’s masked, I found an empty file in <code>/etc/systemd</code>:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># ls -al /etc/systemd/system/systemd-rfkill@.service \n-rwxr-xr-x. 1 root root 0 May 11 16:36 /etc/systemd/system/systemd-rfkill@.service</pre></td></tr></tbody></table></div>\n\n<p>I don’t remember making that file. Did something else put it there?</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="html"># rpm -qf /etc/systemd/system/systemd-rfkill@.service\ntlp-0.7-4.fc22.noarch</pre></td></tr></tbody></table></div>\n\n<p>Ah, <a href="http://linrunner.de/en/tlp/tlp.html">tlp</a>!</p>\n<h3>Configuring tlp</h3>\n<p>I looked in tlp’s configuration file in <code>/etc/default/tlp</code> and found a few helpful configuration items:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;"># Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown</span>\n<span style="color: #666666; font-style: italic;"># on system startup: 0=disable, 1=enable.</span>\n<span style="color: #666666; font-style: italic;"># Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below</span>\n<span style="color: #666666; font-style: italic;"># are ignored when this is enabled!</span>\n<span style="color: #007800;">RESTORE_DEVICE_STATE_ON_STARTUP</span>=<span style="color: #000000;">0</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on startup: bluetooth, wifi, wwan.</span>\n<span style="color: #666666; font-style: italic;"># Separate multiple devices with spaces.</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_STARTUP="wifi"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (workaround for devices that are blocking shutdown).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on shutdown: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;"># (to prevent other operating systems from missing radios).</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_SHUTDOWN="wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to enable on AC: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_ENABLE_ON_AC="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery: bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT="bluetooth wifi wwan"</span>\n\xa0\n<span style="color: #666666; font-style: italic;"># Radio devices to disable on battery when not in use (not connected):</span>\n<span style="color: #666666; font-style: italic;"># bluetooth, wifi, wwan</span>\n<span style="color: #666666; font-style: italic;">#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>So tlp’s default configuration doesn’t restore device state <b>and</b> it masked systemd’s rfkill service. I adjusted one line in tlp’s configuration and rebooted:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #007800;">DEVICES_TO_DISABLE_ON_STARTUP</span>=<span style="color: #ff0000;">"bluetooth wifi wwan"</span></pre></td></tr></tbody></table></div>\n\n<p>After the reboot, both the wifi and Bluetooth functionality were shut off! That’s exactly what I needed.</p>\n<h3>Extra credit</h3>\n<p>Thanks to a coworker, I was able to make a NetworkManager script to automatically shut off the wireless LAN whenever I connected to a network via ethernet. This is typically what I do when coming back from an in-person meeting to my desk (where I have ethernet connectivity).</p>\n<p>If you want the same automation, just drop this script into <code>/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh</code> and make it executable:</p>\n\n<div class="wp_syntax"><table><tbody><tr><td class="code"><pre style="font-family: monospace;" class="bash"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>\n<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LC_ALL</span>=C\n\xa0\nenable_disable_wifi <span style="color: #7a0874; font-weight: bold;">(</span><span style="color: #7a0874; font-weight: bold;">)</span>\n<span style="color: #7a0874; font-weight: bold;">{</span>\n <span style="color: #007800;">result</span>=$<span style="color: #7a0874; font-weight: bold;">(</span>nmcli dev <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">"ethernet"</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-w</span> <span style="color: #ff0000;">"connected"</span><span style="color: #7a0874; font-weight: bold;">)</span>\n <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">"<span style="color: #007800;">$result</span>"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n nmcli radio wifi off\n <span style="color: #000000; font-weight: bold;">fi</span>\n<span style="color: #7a0874; font-weight: bold;">}</span>\n\xa0\n<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">[</span> <span style="color: #ff0000;">"$2"</span> = <span style="color: #ff0000;">"up"</span> <span style="color: #7a0874; font-weight: bold;">]</span>; <span style="color: #000000; font-weight: bold;">then</span>\n enable_disable_wifi\n<span style="color: #000000; font-weight: bold;">fi</span></pre></td></tr></tbody></table></div>\n\n<p>Unplug the ethernet connection, start wifi, and then plug the ethernet connection back in. Once NetworkManager fully connects (DHCP lease obtained, connectivity check passes), the wireless LAN should shut off automatically.</p>\n<p>The post <a href="https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/" rel="nofollow">Restoring wireless and Bluetooth state after reboot in Fedora 22</a> appeared first on <a href="https://major.io" rel="nofollow">major.io</a>.</p></div>', 'title': 'Restoring wireless and Bluetooth state after reboot in Fedora 22', 'date': <GDateTime at 0x5606cd406060>, 'author_homepage': 'https://major.io', 'url': 'https://major.io/2015/07/19/restoring-wireless-and-bluetooth-state-after-reboot-in-fedora-22/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdaf8 (GtkFlowBox at 0x5606cd70eac0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('This week in Fedora'), returned This week in Fedora
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16bde58 (uninitialized at 0x0)>, {'fullname': 'This week in Fedora', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <div id="activities" class="section">\n<h2>Activities</h2>\n<table border="1" class="docutils"><colgroup><col width="42%"/><col width="15%"/><col width="42%"/></colgroup><thead valign="bottom"><tr><th class="head">Activities</th>\n<th class="head">Amount</th>\n<th class="head">Diff to previous week</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>503</td>\n<td>-01.95%</td>\n</tr><tr><td>Builds</td>\n<td>16382</td>\n<td>-14.23%</td>\n</tr><tr><td>Copr build completed</td>\n<td>3913</td>\n<td>-07.67%</td>\n</tr><tr><td>Copr build started</td>\n<td>3932</td>\n<td>-09.73%</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>550</td>\n<td>+81.52%</td>\n</tr><tr><td>FAS user created</td>\n<td>112</td>\n<td>+27.27%</td>\n</tr><tr><td>Meeting completed</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>Meeting started</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>New packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Posts on the planet</td>\n<td>67</td>\n<td>+34.00%</td>\n</tr><tr><td>Retired packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Updates to stable</td>\n<td>244</td>\n<td>-33.33%</td>\n</tr><tr><td>Updates to testing</td>\n<td>448</td>\n<td>+00.22%</td>\n</tr></tbody></table></div>\n<div id="top-contributors-of-the-week" class="section">\n<h2>Top contributors of the week</h2>\n<table border="1" class="docutils"><colgroup><col width="31%"/><col width="69%"/></colgroup><thead valign="bottom"><tr><th class="head">Activites</th>\n<th class="head">Contributors</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>kelvar81 (8), binaryop (6), itamarjp (6)</td>\n</tr><tr><td>Builds</td>\n<td>pbrobinson (6237), sharkcz (3578), karsten (2819)</td>\n</tr><tr><td>Copr build completed</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Copr build started</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>jkurik (41), adamwill (33), fedoradummy (28)</td>\n</tr><tr><td>Meeting completed</td>\n<td>nirik (10), dgilmore (8), danofsatx (5)</td>\n</tr><tr><td>Meeting started</td>\n<td>decause (2), dgilmore (2), nirik (2)</td>\n</tr><tr><td>New packages</td>\n<td>\xa0</td>\n</tr><tr><td>Posts on the planet</td>\n<td>adamwill (8), admin (5), johe (3)</td>\n</tr><tr><td>Retired packages</td>\n<td>\xa0</td>\n</tr><tr><td>Updates to stable</td>\n<td>siwinski (45), hguemar (19), remi (18)</td>\n</tr><tr><td>Updates to testing</td>\n<td>remi (36), raveit65 (24), orion (20)</td>\n</tr></tbody></table></div></div>', 'title': 'Activities from Mon, 13 Jul 2015 to Sun, 19 Jul 2015', 'date': <GDateTime at 0x5606cd415600>, 'author_homepage': 'http://thisweekinfedora.org', 'url': 'http://thisweekinfedora.org/posts/2015_07_19.html', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'This week in Fedora', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <div id="activities" class="section">\n<h2>Activities</h2>\n<table border="1" class="docutils"><colgroup><col width="42%"/><col width="15%"/><col width="42%"/></colgroup><thead valign="bottom"><tr><th class="head">Activities</th>\n<th class="head">Amount</th>\n<th class="head">Diff to previous week</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>503</td>\n<td>-01.95%</td>\n</tr><tr><td>Builds</td>\n<td>16382</td>\n<td>-14.23%</td>\n</tr><tr><td>Copr build completed</td>\n<td>3913</td>\n<td>-07.67%</td>\n</tr><tr><td>Copr build started</td>\n<td>3932</td>\n<td>-09.73%</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>550</td>\n<td>+81.52%</td>\n</tr><tr><td>FAS user created</td>\n<td>112</td>\n<td>+27.27%</td>\n</tr><tr><td>Meeting completed</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>Meeting started</td>\n<td>28</td>\n<td>+12.00%</td>\n</tr><tr><td>New packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Posts on the planet</td>\n<td>67</td>\n<td>+34.00%</td>\n</tr><tr><td>Retired packages</td>\n<td>0</td>\n<td>NA</td>\n</tr><tr><td>Updates to stable</td>\n<td>244</td>\n<td>-33.33%</td>\n</tr><tr><td>Updates to testing</td>\n<td>448</td>\n<td>+00.22%</td>\n</tr></tbody></table></div>\n<div id="top-contributors-of-the-week" class="section">\n<h2>Top contributors of the week</h2>\n<table border="1" class="docutils"><colgroup><col width="31%"/><col width="69%"/></colgroup><thead valign="bottom"><tr><th class="head">Activites</th>\n<th class="head">Contributors</th>\n</tr></thead><tbody valign="top"><tr><td>Badges awarded</td>\n<td>kelvar81 (8), binaryop (6), itamarjp (6)</td>\n</tr><tr><td>Builds</td>\n<td>pbrobinson (6237), sharkcz (3578), karsten (2819)</td>\n</tr><tr><td>Copr build completed</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Copr build started</td>\n<td>avsej (588), andykimpe (303), raveit65 (150)</td>\n</tr><tr><td>Edit on the wiki</td>\n<td>jkurik (41), adamwill (33), fedoradummy (28)</td>\n</tr><tr><td>Meeting completed</td>\n<td>nirik (10), dgilmore (8), danofsatx (5)</td>\n</tr><tr><td>Meeting started</td>\n<td>decause (2), dgilmore (2), nirik (2)</td>\n</tr><tr><td>New packages</td>\n<td>\xa0</td>\n</tr><tr><td>Posts on the planet</td>\n<td>adamwill (8), admin (5), johe (3)</td>\n</tr><tr><td>Retired packages</td>\n<td>\xa0</td>\n</tr><tr><td>Updates to stable</td>\n<td>siwinski (45), hguemar (19), remi (18)</td>\n</tr><tr><td>Updates to testing</td>\n<td>remi (36), raveit65 (24), orion (20)</td>\n</tr></tbody></table></div></div>', 'title': 'Activities from Mon, 13 Jul 2015 to Sun, 19 Jul 2015', 'date': <GDateTime at 0x5606cd415600>, 'author_homepage': 'http://thisweekinfedora.org', 'url': 'http://thisweekinfedora.org/posts/2015_07_19.html', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdaf8 (GtkFlowBox at 0x5606cd70eac0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('dustymabe'), returned dustymabe
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16bdea0 (uninitialized at 0x0)>, {'fullname': 'dustymabe', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <h1 id="history">History</h1>\n<p>In <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> of this series I discussed why I desired a computer setup where I can do full system snapshots so I could seamlessly roll back at will. I also gave an overview of how I went about setting up a system so it could take advantage of <code>BTRFS</code> and <code>snapper</code> to do full system snapshotting and recovery. In this final post of the series I will give an overview of how to get <code>snapper</code> installed and configured on the system and walk through using it to do a rollback.</p>\n<h1 id="installing-and-configuring-snapper">Installing and Configuring Snapper</h1>\n<p>First things first, as part of this whole setup I want to be able to tell how much space each one of my snapshots are taking up. I covered how to do this in a <a href="http://dustymabe.com/2013/09/22/btrfs-how-big-are-my-snapshots/">previous post</a>, but the way you do it is by enabled <code>quota</code> on the <code>BTRFS</code> filesystem:</p>\n<pre><code>[root@localhost ~]# btrfs quota enable / \n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\n[root@localhost ~]# btrfs qgroup show /\nWARNING: Rescan is running, qgroup data may be incorrect\nqgroupid rfer excl \n-------- ---- ---- \n0/5 975.90MiB 975.90MiB \n0/258 16.00KiB 16.00KiB</code></pre>\n<p>You can see from the output that we currently have two subvolumes. One of them is the <em>root subvolume</em> while the other is a subvolume automatically created by <code>systemd</code> for <code>systemd-nspawn</code> container images.</p>\n<p>Now that we have quota enabled let\'s get <code>snapper</code> installed and configured:</p>\n<pre><code>[root@localhost ~]# dnf install -y snapper\n...\nComplete!\n[root@localhost ~]# snapper --config=root create-config /\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \n[root@localhost ~]# snapper list-configs\nConfig | Subvolume\n-------+----------\nroot | / \n[root@localhost ~]#\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 83 top level 5 path .snapshots</code></pre>\n<p>So we used the <code>snapper</code> command to create a configuration for <code>BTRFS</code> filesystem mounted at <code>/</code>. As part of this process we can see from the <code>btrfs subvolume list /</code> command that <code>snapper</code> also created a <code>.snapshots</code> subvolume. This subvolume will be used to house the <code>COW</code> snapshots that are taken of the system.</p>\n<p>The next thing we want to do is add an entry to <code>fstab</code> to make it so that regardless of what subvolume we are actually booted into we will always be able to view the <code>.snapshots</code> subvolume and all nested subvolumes (snapshots):</p>\n<pre><code>[root@localhost ~]# echo \'/dev/vgroot/lvroot /.snapshots btrfs subvol=.snapshots 0 0\' &gt;&gt; /etc/fstab</code></pre>\n<h1 id="taking-snapshots">Taking Snapshots</h1>\n<p>OK, now that we have snapper installed and the <code>.snapshots</code> subvolume in <code>/etc/fstab</code> we can start creating snapshots:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 5 (FS_TREE)\n[root@localhost ~]# snapper create --description "BigBang"\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang |\n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 90 top level 5 path .snapshots\nID 261 gen 88 top level 260 path .snapshots/1/snapshot\n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/1/snapshot/\nbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var</code></pre>\n<p>We made our first snapshot called <strong>BigBang</strong> and then ran a <code>btrfs subvolume list /</code> to view that a new snapshot was actually created. Notice at the top of the output of the sections that we ran a <code>btrfs subvolume get-default /</code>. This outputs what the currently set <em>default subvolume</em> is for the <code>BTRFS</code> filesystem. Right now we are booted into the <em>root subvolume</em> but that will change as soon as we decide we want to use one of the snapshots for rollback.</p>\n<p>Since we took a snapshot let\'s go ahead and make some changes to the system:</p>\n<pre><code>[root@localhost ~]# dnf install -y htop\n[root@localhost ~]# rpm -q htop\nhtop-1.0.3-4.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# snapper status 1..0 | grep htop\n+..... /usr/bin/htop\n+..... /usr/share/doc/htop\n+..... /usr/share/doc/htop/AUTHORS\n+..... /usr/share/doc/htop/COPYING\n+..... /usr/share/doc/htop/ChangeLog\n+..... /usr/share/doc/htop/README\n+..... /usr/share/man/man1/htop.1.gz\n+..... /usr/share/pixmaps/htop.png\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_data\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_type\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/command_line\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/from_repo\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/installed_by\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/reason\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/releasever</code></pre>\n<p>So from this we installed <code>htop</code> and then compared the current running system (<code>0</code>) with snapshot <code>1</code>.</p>\n<h1 id="rolling-back">Rolling Back</h1>\n<p>Now that we have taken a previous snapshot and have since made a change to the system we can use the <code>snapper rollback</code> functionality to get back to the state the system was in before we made the change. Let\'s do the rollback to get back to the snapshot <code>1</code> <strong>BigBang</strong> state:</p>\n<pre><code>[root@localhost ~]# snapper rollback 1\nCreating read-only snapshot of current system. (Snapshot 2.)\nCreating read-write snapshot of snapshot 1. (Snapshot 3.)\nSetting default subvolume to snapshot 3.\n[root@localhost ~]# reboot</code></pre>\n<p>As part of the rollback process you specify to <code>snapper</code> which snapshot you want to go back to. It then creates a read-only snapshot of the current system (in case you change your mind and want to get back to where you currently are) and then a new read-write subvolume based on the snapshot you specified to go back to. It then sets the <em>default subvolume</em> to be the newly created read-write subvolume it just created. After a reboot you will be booted into the new read-write subvolume and your state should be exactly as it was at the time you made the original snapshot.</p>\n<p>In our case, after reboot we should now be booted into snapshot 3 as indicated by the output of the <code>snapper rollback</code> command above and we should be able to inspect information about all of the snapshots on the system:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 263 gen 104 top level 260 path .snapshots/3/snapshot\n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | | \n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/\n1 2 3\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 100 top level 5 path .snapshots\nID 261 gen 98 top level 260 path .snapshots/1/snapshot\nID 262 gen 97 top level 260 path .snapshots/2/snapshot\nID 263 gen 108 top level 260 path .snapshots/3/snapshot</code></pre>\n<p>And the big test is to see if the change we made to the system was actually reverted:</p>\n<pre><code>[root@localhost ~]# rpm -q htop\npackage htop is not installed</code></pre>\n<p>Bliss!!</p>\n<p>Now in my case I like to have more descriptive notes on my snapshots so I\'ll go back now and give some notes for snapshots 2 and 3:</p>\n<pre><code>[root@localhost ~]# snapper modify --description "installed htop" 2\n[root@localhost ~]# snapper modify --description "rollback to 1 - read/write" 3 \n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+----------------------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | installed htop | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | rollback to 1 - read/write |</code></pre>\n<p>We can also see how much space (shared and exclusive each of the snapshots are taking up:</p>\n<pre><code>[root@localhost ~]# btrfs qgroup show / \nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 2.60MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.08GiB 18.91MiB</code></pre>\n<p>Now that is useful info so you can know how much space you will be recovering when you delete snapshots in the future.</p>\n<h1 id="updating-the-kernel">Updating The Kernel</h1>\n<p>I mentioned in <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> that I had to get a special rebuild of <code>GRUB</code> with some patches from the <code>SUSE</code> guys in order to get booting from the default subvolume to work. This was all needed so that I can update the kernel as normal and have the <code>GRUB</code> files that get used be the ones that are in the actual subvolume I am currently using. So let\'s test it out by doing a full system update (including a kernel update):</p>\n<pre><code>[root@localhost ~]# dnf update -y\n...\nInstall 8 Packages\nUpgrade 173 Packages\n...\nComplete!\n[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# btrfs qgroup show /\nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 11.96MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.19GiB 444.35MiB</code></pre>\n<p>So we did a full system upgrade that upgraded 173 packages and installed a few others. We can see now that the current subvolume (snapshot <code>3</code> with ID <code>263</code>) now has 444MiB of exclusive data. This makes sense since all of the other snapshots were from before the full system update.</p>\n<p>Let\'s create a new snapshot that represents the state of the system right after we did the full system update and then reboot:</p>\n<pre><code>[root@localhost ~]# snapper create --description "full system upgrade"\n[root@localhost ~]# reboot</code></pre>\n<p>After reboot we can now check to see if we have properly booted the recently installed kernel:</p>\n<pre><code>[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# uname -r\n4.0.7-300.fc22.x86_64</code></pre>\n<p>Bliss again. Yay! And I\'m Done.</p>\n<p>Enjoy!</p>\n<p>Dusty</p></div>', 'title': 'Fedora BTRFS+Snapper PART 2: Full System Snapshot/Rollback', 'date': <GDateTime at 0x5606cd4162c0>, 'author_homepage': 'http://dustymabe.com', 'url': 'http://dustymabe.com/2015/07/19/fedora-btrfssnapper-part-2-full-system-snapshotrollback/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'dustymabe', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.fedoraproject.org/images/heads/default.png" alt="" style="float: right;"/>\n <h1 id="history">History</h1>\n<p>In <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> of this series I discussed why I desired a computer setup where I can do full system snapshots so I could seamlessly roll back at will. I also gave an overview of how I went about setting up a system so it could take advantage of <code>BTRFS</code> and <code>snapper</code> to do full system snapshotting and recovery. In this final post of the series I will give an overview of how to get <code>snapper</code> installed and configured on the system and walk through using it to do a rollback.</p>\n<h1 id="installing-and-configuring-snapper">Installing and Configuring Snapper</h1>\n<p>First things first, as part of this whole setup I want to be able to tell how much space each one of my snapshots are taking up. I covered how to do this in a <a href="http://dustymabe.com/2013/09/22/btrfs-how-big-are-my-snapshots/">previous post</a>, but the way you do it is by enabled <code>quota</code> on the <code>BTRFS</code> filesystem:</p>\n<pre><code>[root@localhost ~]# btrfs quota enable / \n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\n[root@localhost ~]# btrfs qgroup show /\nWARNING: Rescan is running, qgroup data may be incorrect\nqgroupid rfer excl \n-------- ---- ---- \n0/5 975.90MiB 975.90MiB \n0/258 16.00KiB 16.00KiB</code></pre>\n<p>You can see from the output that we currently have two subvolumes. One of them is the <em>root subvolume</em> while the other is a subvolume automatically created by <code>systemd</code> for <code>systemd-nspawn</code> container images.</p>\n<p>Now that we have quota enabled let\'s get <code>snapper</code> installed and configured:</p>\n<pre><code>[root@localhost ~]# dnf install -y snapper\n...\nComplete!\n[root@localhost ~]# snapper --config=root create-config /\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \n[root@localhost ~]# snapper list-configs\nConfig | Subvolume\n-------+----------\nroot | / \n[root@localhost ~]#\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 83 top level 5 path .snapshots</code></pre>\n<p>So we used the <code>snapper</code> command to create a configuration for <code>BTRFS</code> filesystem mounted at <code>/</code>. As part of this process we can see from the <code>btrfs subvolume list /</code> command that <code>snapper</code> also created a <code>.snapshots</code> subvolume. This subvolume will be used to house the <code>COW</code> snapshots that are taken of the system.</p>\n<p>The next thing we want to do is add an entry to <code>fstab</code> to make it so that regardless of what subvolume we are actually booted into we will always be able to view the <code>.snapshots</code> subvolume and all nested subvolumes (snapshots):</p>\n<pre><code>[root@localhost ~]# echo \'/dev/vgroot/lvroot /.snapshots btrfs subvol=.snapshots 0 0\' &gt;&gt; /etc/fstab</code></pre>\n<h1 id="taking-snapshots">Taking Snapshots</h1>\n<p>OK, now that we have snapper installed and the <code>.snapshots</code> subvolume in <code>/etc/fstab</code> we can start creating snapshots:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 5 (FS_TREE)\n[root@localhost ~]# snapper create --description "BigBang"\n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang |\n[root@localhost ~]# \n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 90 top level 5 path .snapshots\nID 261 gen 88 top level 260 path .snapshots/1/snapshot\n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/1/snapshot/\nbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var</code></pre>\n<p>We made our first snapshot called <strong>BigBang</strong> and then ran a <code>btrfs subvolume list /</code> to view that a new snapshot was actually created. Notice at the top of the output of the sections that we ran a <code>btrfs subvolume get-default /</code>. This outputs what the currently set <em>default subvolume</em> is for the <code>BTRFS</code> filesystem. Right now we are booted into the <em>root subvolume</em> but that will change as soon as we decide we want to use one of the snapshots for rollback.</p>\n<p>Since we took a snapshot let\'s go ahead and make some changes to the system:</p>\n<pre><code>[root@localhost ~]# dnf install -y htop\n[root@localhost ~]# rpm -q htop\nhtop-1.0.3-4.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# snapper status 1..0 | grep htop\n+..... /usr/bin/htop\n+..... /usr/share/doc/htop\n+..... /usr/share/doc/htop/AUTHORS\n+..... /usr/share/doc/htop/COPYING\n+..... /usr/share/doc/htop/ChangeLog\n+..... /usr/share/doc/htop/README\n+..... /usr/share/man/man1/htop.1.gz\n+..... /usr/share/pixmaps/htop.png\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_data\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/checksum_type\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/command_line\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/from_repo\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/installed_by\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/reason\n+..... /var/lib/dnf/yumdb/h/2cd64300c204b0e1ecc9ad185259826852226561-htop-1.0.3-4.fc22-x86_64/releasever</code></pre>\n<p>So from this we installed <code>htop</code> and then compared the current running system (<code>0</code>) with snapshot <code>1</code>.</p>\n<h1 id="rolling-back">Rolling Back</h1>\n<p>Now that we have taken a previous snapshot and have since made a change to the system we can use the <code>snapper rollback</code> functionality to get back to the state the system was in before we made the change. Let\'s do the rollback to get back to the snapshot <code>1</code> <strong>BigBang</strong> state:</p>\n<pre><code>[root@localhost ~]# snapper rollback 1\nCreating read-only snapshot of current system. (Snapshot 2.)\nCreating read-write snapshot of snapshot 1. (Snapshot 3.)\nSetting default subvolume to snapshot 3.\n[root@localhost ~]# reboot</code></pre>\n<p>As part of the rollback process you specify to <code>snapper</code> which snapshot you want to go back to. It then creates a read-only snapshot of the current system (in case you change your mind and want to get back to where you currently are) and then a new read-write subvolume based on the snapshot you specified to go back to. It then sets the <em>default subvolume</em> to be the newly created read-write subvolume it just created. After a reboot you will be booted into the new read-write subvolume and your state should be exactly as it was at the time you made the original snapshot.</p>\n<p>In our case, after reboot we should now be booted into snapshot 3 as indicated by the output of the <code>snapper rollback</code> command above and we should be able to inspect information about all of the snapshots on the system:</p>\n<pre><code>[root@localhost ~]# btrfs subvolume get-default /\nID 263 gen 104 top level 260 path .snapshots/3/snapshot\n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+-------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | | \n[root@localhost ~]# \n[root@localhost ~]# ls /.snapshots/\n1 2 3\n[root@localhost ~]# btrfs subvolume list /\nID 258 gen 50 top level 5 path var/lib/machines\nID 260 gen 100 top level 5 path .snapshots\nID 261 gen 98 top level 260 path .snapshots/1/snapshot\nID 262 gen 97 top level 260 path .snapshots/2/snapshot\nID 263 gen 108 top level 260 path .snapshots/3/snapshot</code></pre>\n<p>And the big test is to see if the change we made to the system was actually reverted:</p>\n<pre><code>[root@localhost ~]# rpm -q htop\npackage htop is not installed</code></pre>\n<p>Bliss!!</p>\n<p>Now in my case I like to have more descriptive notes on my snapshots so I\'ll go back now and give some notes for snapshots 2 and 3:</p>\n<pre><code>[root@localhost ~]# snapper modify --description "installed htop" 2\n[root@localhost ~]# snapper modify --description "rollback to 1 - read/write" 3 \n[root@localhost ~]# \n[root@localhost ~]# snapper ls\nType | # | Pre # | Date | User | Cleanup | Description | Userdata\n-------+---+-------+--------------------------+------+---------+----------------------------+---------\nsingle | 0 | | | root | | current | \nsingle | 1 | | Tue Jul 14 23:07:42 2015 | root | | BigBang | \nsingle | 2 | | Tue Jul 14 23:14:12 2015 | root | | installed htop | \nsingle | 3 | | Tue Jul 14 23:14:12 2015 | root | | rollback to 1 - read/write |</code></pre>\n<p>We can also see how much space (shared and exclusive each of the snapshots are taking up:</p>\n<pre><code>[root@localhost ~]# btrfs qgroup show / \nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 2.60MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.08GiB 18.91MiB</code></pre>\n<p>Now that is useful info so you can know how much space you will be recovering when you delete snapshots in the future.</p>\n<h1 id="updating-the-kernel">Updating The Kernel</h1>\n<p>I mentioned in <a href="http://dustymabe.com/2015/07/14/fedora-btrfssnapper-part-1-system-preparation/">part 1</a> that I had to get a special rebuild of <code>GRUB</code> with some patches from the <code>SUSE</code> guys in order to get booting from the default subvolume to work. This was all needed so that I can update the kernel as normal and have the <code>GRUB</code> files that get used be the ones that are in the actual subvolume I am currently using. So let\'s test it out by doing a full system update (including a kernel update):</p>\n<pre><code>[root@localhost ~]# dnf update -y\n...\nInstall 8 Packages\nUpgrade 173 Packages\n...\nComplete!\n[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# \n[root@localhost ~]# btrfs qgroup show /\nWARNING: Qgroup data inconsistent, rescan recommended\nqgroupid rfer excl \n-------- ---- ---- \n0/5 1.08GiB 7.53MiB \n0/258 16.00KiB 16.00KiB \n0/260 16.00KiB 16.00KiB \n0/261 1.07GiB 11.96MiB \n0/262 1.07GiB 740.00KiB \n0/263 1.19GiB 444.35MiB</code></pre>\n<p>So we did a full system upgrade that upgraded 173 packages and installed a few others. We can see now that the current subvolume (snapshot <code>3</code> with ID <code>263</code>) now has 444MiB of exclusive data. This makes sense since all of the other snapshots were from before the full system update.</p>\n<p>Let\'s create a new snapshot that represents the state of the system right after we did the full system update and then reboot:</p>\n<pre><code>[root@localhost ~]# snapper create --description "full system upgrade"\n[root@localhost ~]# reboot</code></pre>\n<p>After reboot we can now check to see if we have properly booted the recently installed kernel:</p>\n<pre><code>[root@localhost ~]# rpm -q kernel\nkernel-4.0.4-301.fc22.x86_64\nkernel-4.0.7-300.fc22.x86_64\n[root@localhost ~]# uname -r\n4.0.7-300.fc22.x86_64</code></pre>\n<p>Bliss again. Yay! And I\'m Done.</p>\n<p>Enjoy!</p>\n<p>Dusty</p></div>', 'title': 'Fedora BTRFS+Snapper PART 2: Full System Snapshot/Rollback', 'date': <GDateTime at 0x5606cd4162c0>, 'author_homepage': 'http://dustymabe.com', 'url': 'http://dustymabe.com/2015/07/19/fedora-btrfssnapper-part-2-full-system-snapshotrollback/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdaf8 (GtkFlowBox at 0x5606cd70eac0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('Jamie Nguyen'), returned Jamie Nguyen
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16bdee8 (uninitialized at 0x0)>, {'fullname': 'Jamie Nguyen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://jamielinux.fedorapeople.org/avatar.png" alt="" style="float: right;"/>\n <p><a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> is an Ansible playbook I created to make it easy to\ndeploy Discourse without Docker. It supports several distributions, including\nCentOS, Debian, Fedora and Ubuntu. Testing and feedback are very welcome!</p>\n<p><a href="http://www.discourse.org/" class="reference external">Discourse</a> is an open source discussion forum application. The Discourse team\nonly supports installation via their offical Docker image. This is a sensible\nmove as the production environment can be kept more consistent across all\ninstallations, making it harder for administrators to break their site with a\nconfiguration error.</p>\n<p>However, some people may want to avoid using Docker. Perhaps you already manage\nyour servers with Ansible, or you want more flexibility over your production\nenvironment. Perhaps you need more secure isolation (eg, hardware\nvirtualization) than Docker can provide (as <a href="https://opensource.com/business/14/7/docker-security-selinux" class="reference external">containers do not contain</a>). If so, you\nmight want to give <a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> a try.</p></div>', 'title': 'Easily install Discourse using Ansible', 'date': <GDateTime at 0x5606cd419740>, 'author_homepage': 'https://jamielinux.com/blog/', 'url': 'https://jamielinux.com/blog/easily-install-discourse-using-ansible/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'Jamie Nguyen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="https://jamielinux.fedorapeople.org/avatar.png" alt="" style="float: right;"/>\n <p><a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> is an Ansible playbook I created to make it easy to\ndeploy Discourse without Docker. It supports several distributions, including\nCentOS, Debian, Fedora and Ubuntu. Testing and feedback are very welcome!</p>\n<p><a href="http://www.discourse.org/" class="reference external">Discourse</a> is an open source discussion forum application. The Discourse team\nonly supports installation via their offical Docker image. This is a sensible\nmove as the production environment can be kept more consistent across all\ninstallations, making it harder for administrators to break their site with a\nconfiguration error.</p>\n<p>However, some people may want to avoid using Docker. Perhaps you already manage\nyour servers with Ansible, or you want more flexibility over your production\nenvironment. Perhaps you need more secure isolation (eg, hardware\nvirtualization) than Docker can provide (as <a href="https://opensource.com/business/14/7/docker-security-selinux" class="reference external">containers do not contain</a>). If so, you\nmight want to give <a href="https://github.com/jamielinux/ansible-discourse" class="reference external">ansible-discourse</a> a try.</p></div>', 'title': 'Easily install Discourse using Ansible', 'date': <GDateTime at 0x5606cd419740>, 'author_homepage': 'https://jamielinux.com/blog/', 'url': 'https://jamielinux.com/blog/easily-install-discourse-using-ansible/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdaf8 (GtkFlowBox at 0x5606cd70eac0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('Daniel.Pocock'), returned Daniel.Pocock
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16bdf30 (uninitialized at 0x0)>, {'fullname': 'Daniel.Pocock', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.debian.org/heads/pocock.png" alt="" style="float: right;"/>\n <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><a href="https://fedoraproject.org/wiki/User:Zoltanh721">Zoltan (Zoltanh721)</a> recently <a href="http://wordpress-zoltanh721.rhcloud.com/?p=24">blogged about WebRTC for the Fedora community and Fedora desktop</a>.</p>\n<p><a href="https://fedrtc.org">https://fedrtc.org</a> has been running for a while now and this has given many people a chance to get a taste of regular SIP and WebRTC-based SIP. As suggested in Zoltan\'s blog, it has convenient integration with Fedora SSO and as the <a href="http://danielpocock.com/free-and-open-webrtc-for-the-fedora-community">source code is available</a>, people are welcome to see how it was built and use it for other projects.</p>\n<h3>Issues with Chrome/Chromium on Linux</h3>\n<p>If you tried any of <a href="https://fedrtc.org">FedRTC.org</a>, <a href="https://rtc.debian.org">rtc.debian.org</a> or <a href="https://meet.jit.si">meet.jit.si</a> using Chrome/Chromium on Linux, you may have found that the call appears to be connected but there is no media. This is a <a href="https://code.google.com/p/chromium/issues/detail?id=501318">bug</a> and the Chromium developers are on to it. You can work around this by trying an older version of Chromium (it still works with v37 from Debian wheezy) or Firefox/Iceweasel.</p>\n<h3>WebRTC is not everything</h3>\n<p><a href="http://danielpocock.com/tags/webrtc">WebRTC</a> offers many great possibilities for people to quickly build and deploy RTC services to a large user base, especially when using components like <a href="http://jscommunicator.org">JSCommunicator</a> or <a href="http://drucall.org">the DruCall WebRTC plugin for Drupal</a>.</p>\n<p>However, it is not a silver bullet. For example, there remain concerns about how to receive incoming calls. How do you know which browser tab is ringing when you have many tabs open at once? This may require greater browser/desktop integration and that has security implications for JavaScript. Whether users on battery-powered devices can really leave JavaScript running for extended periods of time waiting for incoming calls is another issue, especially when you consider that many web sites contain some JavaScript that is less than efficient.</p>\n<p>Native applications and mobile apps like <a href="http://lumicall.org">Lumicall</a> continue to offer the most optimized solution for each platform although WebRTC currently offers the most convenient way for people to place a <em>Call me</em> link on their web site or portal.</p>\n<h3>Deploy it yourself</h3>\n<p>The <a href="http://rtcquickstart.org">RTC Quick Start Guide</a> offers step-by-step instructions and a thorough discussion of the architecture for people to start deploying RTC and WebRTC on their own servers using standard packages on many of the most popular Linux distributions, including Debian, Ubuntu, RHEL, CentOS and Fedora.</p>\n</div></div></div></div>', 'title': 'RTC status on Debian, Ubuntu and Fedora', 'date': <GDateTime at 0x5606cd403880>, 'author_homepage': 'http://danielpocock.com/tags/fedora', 'url': 'http://danielpocock.com/rtc-status-on-debian-ubuntu-and-fedora-july-2015', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'Daniel.Pocock', 'content': '<div xmlns="http://www.w3.org/1999/xhtml" xml:base="https://fedoraproject.org/people/"><img src="http://planet.debian.org/heads/pocock.png" alt="" style="float: right;"/>\n <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><a href="https://fedoraproject.org/wiki/User:Zoltanh721">Zoltan (Zoltanh721)</a> recently <a href="http://wordpress-zoltanh721.rhcloud.com/?p=24">blogged about WebRTC for the Fedora community and Fedora desktop</a>.</p>\n<p><a href="https://fedrtc.org">https://fedrtc.org</a> has been running for a while now and this has given many people a chance to get a taste of regular SIP and WebRTC-based SIP. As suggested in Zoltan\'s blog, it has convenient integration with Fedora SSO and as the <a href="http://danielpocock.com/free-and-open-webrtc-for-the-fedora-community">source code is available</a>, people are welcome to see how it was built and use it for other projects.</p>\n<h3>Issues with Chrome/Chromium on Linux</h3>\n<p>If you tried any of <a href="https://fedrtc.org">FedRTC.org</a>, <a href="https://rtc.debian.org">rtc.debian.org</a> or <a href="https://meet.jit.si">meet.jit.si</a> using Chrome/Chromium on Linux, you may have found that the call appears to be connected but there is no media. This is a <a href="https://code.google.com/p/chromium/issues/detail?id=501318">bug</a> and the Chromium developers are on to it. You can work around this by trying an older version of Chromium (it still works with v37 from Debian wheezy) or Firefox/Iceweasel.</p>\n<h3>WebRTC is not everything</h3>\n<p><a href="http://danielpocock.com/tags/webrtc">WebRTC</a> offers many great possibilities for people to quickly build and deploy RTC services to a large user base, especially when using components like <a href="http://jscommunicator.org">JSCommunicator</a> or <a href="http://drucall.org">the DruCall WebRTC plugin for Drupal</a>.</p>\n<p>However, it is not a silver bullet. For example, there remain concerns about how to receive incoming calls. How do you know which browser tab is ringing when you have many tabs open at once? This may require greater browser/desktop integration and that has security implications for JavaScript. Whether users on battery-powered devices can really leave JavaScript running for extended periods of time waiting for incoming calls is another issue, especially when you consider that many web sites contain some JavaScript that is less than efficient.</p>\n<p>Native applications and mobile apps like <a href="http://lumicall.org">Lumicall</a> continue to offer the most optimized solution for each platform although WebRTC currently offers the most convenient way for people to place a <em>Call me</em> link on their web site or portal.</p>\n<h3>Deploy it yourself</h3>\n<p>The <a href="http://rtcquickstart.org">RTC Quick Start Guide</a> offers step-by-step instructions and a thorough discussion of the architecture for people to start deploying RTC and WebRTC on their own servers using standard packages on many of the most popular Linux distributions, including Debian, Ubuntu, RHEL, CentOS and Fedora.</p>\n</div></div></div></div>', 'title': 'RTC status on Debian, Ubuntu and Fedora', 'date': <GDateTime at 0x5606cd403880>, 'author_homepage': 'http://danielpocock.com/tags/fedora', 'url': 'http://danielpocock.com/rtc-status-on-debian-ubuntu-and-fedora-july-2015', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdaf8 (GtkFlowBox at 0x5606cd70eac0)>), returned None
15:25:13 DEBUG view.py:100 |||gnomenews.view._add_new_feed(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'url': 'https://planet.fedoraproject.org/atom.xml', 'title': 'Fedora People'}), returned None
15:25:13 INFO Adding channel https://planet.gnome.org/atom.xml
15:25:13 DEBUG
SELECT
nie:url(?msg) AS url
nie:title(?msg) AS title
nco:fullname(?creator) AS fullname
nie:url(?website) AS author_homepage
nco:emailAddress(?email) AS author_email
nie:contentCreated(?msg) AS date
nmo:htmlMessageContent(?msg) AS content
nmo:isRead(?msg) AS is_read
{ ?msg a mfo:FeedMessage;
nmo:communicationChannel ?chan;
nco:creator ?creator
{ ?chan nie:url "https://planet.gnome.org/atom.xml" }.
OPTIONAL { ?creator nco:hasEmailAddress ?email } .
OPTIONAL { ?creator nco:websiteUrl ?website }
}
ORDER BY DESC (nie:contentCreated(?msg))
LIMIT 10
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16cb048 (TrackerDBCursor at 0x5606cda4df60)>), returned {'fullname': 'Jakub Brindza', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It seemed to take forever. Endless PR reviews, improvements, code refactoring and hours spent working on editor, removing deprecated icons or search.<br/><br/>However, at the beginning of this week I finally managed to get the pull requests to a state when they could be merged. As a consequence, Getting Things GNOME! now features (well, from 99% I dare to say) most up-to-date widgets and properties. Moreover, master version is now boosted with re-designed editor window as you can see from the photo here:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-P4VIu-UTPX0/VZ_SYuDT8wI/AAAAAAAAEH8/ti8zCCQIXWM/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B16.09.21.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://3.bp.blogspot.com/-P4VIu-UTPX0/VZ_SYuDT8wI/AAAAAAAAEH8/ti8zCCQIXWM/s400/Screen%2BShot%2B2015-07-10%2Bat%2B16.09.21.png" width="400"/></a></div><div class="separator" style="clear: both; text-align: center;"><br/></div><div class="separator" style="clear: both; text-align: left;">As for another challenge I decided to face in my summer experience, I chose to refurbish preferences.</div><div class="separator" style="clear: both; text-align: left;">All in all, the beginnings were not that tough. Currently, my version features re-newed implementation of the general settings.</div><div class="separator" style="clear: both; text-align: left;">In the (very soon) future, I\'ll moreover be implementing also the plugins and synchronisation services in the same preferences window. This way, users will be experiencing a much simpler to use and friendlier environment when it comes to customisation of the app.</div><div class="separator" style="clear: both; text-align: left;"><br/></div><div class="separator" style="clear: both; text-align: left;">Without some exhausting descriptions, take a look at the current additions to the Getting Things GNOME!</div><div class="separator" style="clear: both; text-align: left;"><br/></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-CoU4QWjHmLg/VZ_Tpu8rpSI/AAAAAAAAEIU/DhgjcoG2u1k/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.58.55.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="http://3.bp.blogspot.com/-CoU4QWjHmLg/VZ_Tpu8rpSI/AAAAAAAAEIU/DhgjcoG2u1k/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.58.55.png" width="400"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Preferences window now features side menu for three major categories and main window to view particular settings</td></tr></tbody></table><br/><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-LIXHRLPYK3Q/VZ_TpCtKfaI/AAAAAAAAEIM/twl3lFVCIYQ/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.02.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="http://4.bp.blogspot.com/-LIXHRLPYK3Q/VZ_TpCtKfaI/AAAAAAAAEIM/twl3lFVCIYQ/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.02.png" width="400"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Plugins and Synchronisation services. Coming soon!</td></tr></tbody></table><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-sf2kZIa1C2I/VZ_TnxplIUI/AAAAAAAAEII/De2Z-mwa-mQ/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.05.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://4.bp.blogspot.com/-sf2kZIa1C2I/VZ_TnxplIUI/AAAAAAAAEII/De2Z-mwa-mQ/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.05.png" width="400"/></a></div><div class="separator" style="clear: both; text-align: left;"><br/></div><br/>In Plugins window, the plan is to re-make entirely the current way of viewing individual plugins. I will be trying to get rid of the treeview and place each plugin in a separate GtkBox. I\'m particularly looking forward to this. The reason is that I have not yet tried to create one general widget that would be applied to all the elements, but rather created all the individual elements. This was both inefficient and exhausting, so I\'d love to learn how to apply the same pattern to several places.<br/><br/>As for the synchronisation services, I\'m sure you\'ll notice some refurbishments here, too, in a short period of time.<br/><br/>The overall aim is to produce a simple, sleek and easy-to-use interface that will be 100% functional and bring Getting Things GNOME again a bit closer to GNOME 3 standards.<br/><br/>I love the changes and so I hope you do as well.<br/><br/>On the other hand, for the past few hours I\'ve been trying to make parents viewing feature in Task Editor functional, since this was one of the features which lacked in <a href="http://www.jakubbrindza.com/2015/06/another-huge-leap-for-gtg.html" target="_blank">my last PR</a>, even though the UI is present. Not many break-throughs in there so far though.<br/>Getting Things GNOME features a function get_parents() whose name I found rather misleading since I found out that it does not give you a list of all parents a task may have (assuming it\'s a task of level 2+), but it gives you only the most direct, one-level-up parent. This makes the entire problem a bit more difficult since I cannot easily, let\'s say, make an array that would hold all the names (or task id\'s) of a task\'s parents which would then be placed into a popover.<br/>This may be tough, but it\'s a core feature which needs to be implemented, so I want to work on it.<br/><br/>Stay tuned!</div>\n </div>', 'title': 'GTG Preferences -- REMADE!', 'date': <GDateTime at 0x5606cd3fa180>, 'author_homepage': 'http://www.blogger.com/profile/12785763043249070999', 'url': 'http://www.jakubbrindza.com/2015/07/gtg-preferences-remade.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16cb048 (TrackerDBCursor at 0x5606cda4df60)>), returned {'fullname': 'Allan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>So <a href="https://mail.gnome.org/archives/foundation-announce/2015-June/msg00003.html">this</a> happened. It’s the first time I’ve served on the Foundation’s Board of Directors, and I thought it would be good to write about the experience.</p>\n<p>The GNOME Foundation Board can often be a bit opaque. Generally it works in the background, and while you can get a sense of some of its activities through <a href="https://wiki.gnome.org/FoundationBoard/Minutes">the minutes</a>, it is easy to forget that the board is out there doing its thing. </p>\n<p>It has been a bit of a revelation to see just how active the board is. It’s a bit like I’ve discovered a new, secret world inside the GNOME project. And there’s a lot happening in this world – it is always busy.</p>\n<p>There’s an IRC channel and several private mailing lists, which are very active. And there are tasks being taken care of all the time – I already have a list of three or four things that I’m sorting out, for example.</p>\n<p>I was impressed by the first board meeting I participated in. There was a clear agenda that was followed, minutes were recorded as the meeting went on, and the meeting ran to time. Many of the agenda items weren’t particularly glamorous, but they were things that need to be done, and there was a good level of scrutiny around each one.</p>\n<p>There have been a few other things that have surprised me about the board. I wasn’t fully aware of how institutionalised it is. We are governed by our <a href="https://www.gnome.org/wp-content/uploads/2012/02/bylaws.pdf">bylaws</a>, which set out how the board has to operate, as well as some of its obligations. I read them recently, and was surprised by a couple of things that are in there. If you’re a Foundation member, you might be interested to take a look.</p>\n<p>Another thing is just how important Rosanna is to the board. For those who don’t know, Rosanna is the Foundation’s Director of Operations. Not only does she take care of a lot of the Foundation’s adminstration, but she is a valuable source of knowledge and expertise, having worked for the Foundation for numerous years. She’s another one of those aspects of the Foundation that is both important and, often, hidden from view.</p>\n<p>I’m still busy learning the ropes, and there’s a lot I have to learn. So far it is satisfying work though, and good to see another side of the GNOME project.</p></div>\n </div>', 'title': 'Diary of a new board member', 'date': <GDateTime at 0x5606cd3f6100>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/aday/2015/07/13/diary-of-a-new-board-member/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16cb048 (TrackerDBCursor at 0x5606cda4df60)>), returned {'fullname': 'shaunm', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The <a href="https://conf.openhelp.cc/">Open Help Conference &amp; Sprints</a> is happening again this year. Open Help is the only event focused on open source documentation and support. It features a two-day conference with a mix of presentations, demos, and open discussions. This format has proven very popular, and really helps people find real solutions to improve their documentation. The conference this year is September 26-27. (But don’t miss the amazing reception September 25!)</p>\n<p>After the conference, Open Help hosts three days of multiple-team sprints. The sprints are September 28-30 this year. Open Help has hosted doc sprints for teams like GNOME, Mozilla, FreeBSD, Wikipedia, WordPress, OpenMRS, and WebPlatform.org. In many cases, Open Help was a team’s first exposure to having a sprint.</p>\n<p>I wrote an <a href="http://opensource.com/community/15/7/five-lessons-open-help-doc-sprints">article on opensource.com</a> about the Open Help doc sprints, along with five tips on holding a successful sprint.</p>\n<p>Documentation is important. This is the fifth year that Open Help will be helping open source teams create better documentation. <strong>But we need your help.</strong> Please spread the word about Open Help to any communities you’re involved with. Send mail to mailing lists. Tweet. Tell your friends. Get the word out however you can.</p>\n<p>Open Help is only great because of the people who come.</p></div>\n </div>', 'title': 'Come to Open Help. Have a Doc Sprint.', 'date': <GDateTime at 0x5606cd3fdcc0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/shaunm/2015/07/13/come-to-open-help-have-a-doc-sprint/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16cb048 (TrackerDBCursor at 0x5606cda4df60)>), returned {'fullname': 'murrayc', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>My <a href="https://github.com/murraycu/android-galaxyzoo/">Galaxy Zoo app for android</a> has been on the Play store for several months now and seems to be generally well liked. So far it has around 800 users, increasing slowly and linearly, probably because it isn’t linked from the galaxyzoo.org website. But even the first hundred users were enough to show me several problems that I needed to fix. I’ve written about them here, with links to the commits that fixed them in my app, because other app developers will experience them too.</p>\n<p>These were general Android development problems, not specific to android-galaxyzoo. I guess that this is the difference between someone who understands how the Android API should be used, and someone who has actually used it with real users. It shouldn’t be quite this difficult.</p>\n<h3>Work in the main thread (Strict Mode)</h3>\n<p>Your code should not perform long-running tasks, such as network or disk IO, in the main thread, because UIs should not be unresponsive. By enabling Strict Mode in your code, you can make this cause exceptions, turning a non-responsive app into a crashing app. It would be unwise to turn this on in your app’s release version.</p>\n<p>However, some “power” users seem to have this on via the developer options. They probably experience instability in many apps. And Android 3.0 (Honeycomb) has some Strict Mode settings on <a href="http://developer.android.com/reference/android/os/StrictMode.ThreadPolicy.Builder.html#penaltyDeathOnNetwork%28%29">by default</a>. So you will get crash reports via the Google Play store if you ignore Strict Mode exceptions.</p>\n<p>As I mentioned in my <a href="http://www.murrayc.com/permalink/tag/android/">previous entry</a>, AccountManager is <a href="http://developer.android.com/reference/android/accounts/AccountManager.html#getAccountsByType%28java.lang.String%29">documented as being safe for use on the Main UI Thread</a>, but it’s not, so I needed to <a href="https://github.com/murraycu/android-galaxyzoo/commit/426918f8c43e5aab0c9946c6fa7e8eebe2f5b531">use the AccountManager via AsyncTask</a>.</p>\n<p>If you are using a ContentProvider, you should not try to store data in the ContentProvider in the main thread. I instead <a href="https://github.com/murraycu/android-galaxyzoo/commit/6a18ce07c4ad136eed94c6d8a9d8eaec96bb303e">did that via AsyncTask.</a></p>\n<p>Likewise, <a href="https://github.com/murraycu/android-galaxyzoo/commit/fdef5fdba83d6ef4dd767e728a08378e294bc631">avoid calling BitmapFactory.decodeStream() in the main thread</a>, though it’s easier to <a href="https://github.com/murraycu/android-galaxyzoo/commit/009ddd077968f1a2feac4de196ec814a74017c62">just use Picasso</a> anyway.</p>\n<h3>Automatic cache deletion</h3>\n<p>Your app probably caches some data, such as images, in its cache directory, such as the <a href="http://developer.android.com/reference/android/content/Context.html#getExternalCacheDir%28%29">getExternalCacheDir()</a> directory (/storage/sdcard/Android/data/com.you.yourapp/cache). However, Android will delete those files whenever it needs the space, and it won’t explicitly tell your app that it’s happened. So you need to check that your cached files really exist, one by one. You can either check the files when you first try to use them (causing UI delay) or you can check in the background, maybe trying to re-download the files.</p>\n<p>This confused my code completely and it was hard to identify the cause of the resulting <a href="https://github.com/murraycu/android-galaxyzoo/issues/12">bug</a> because the cache deletion by the system was not triggered by any particular action in my app.</p>\n<p>By the way, although the <a href="http://developer.android.com/reference/android/content/Context.html#getExternalCacheDir%28%29">getExternalCacheDir() documentation</a> says that you don’t need to request permission to use that (app’s own) directory since Android 4.4 (KitKat), that’s not true – you do <a href="http://stackoverflow.com/questions/27016647/why-do-i-need-the-write-external-storage-permission-with-getexternalcachedir-o">need to request the permission on Android 5.0 (Lollipop)</a>.</p>\n<h3>IllegalStateException: Can not perform this action after onSaveInstanceState</h3>\n<p>There are things that you cannot do in between an activity’s state being saved and that activity being resumed. It’s hard to know when that is the case but if you get it wrong then your app will crash. Here’s a <a href="http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html">full explanatio</a>n, though you’ll wish you didn’t have to bother with it.</p>\n<p>For instance, you should delay any use of AlertDialog until the parent activity’s onResumeFragments, which I did <a href="https://github.com/murraycu/android-galaxyzoo/commit/012b88c13d9f082fc99d0dee9e5b196f94ff5d60">like so</a>.</p>\n<p>Likewise, you should not commit fragment transactions until after your activity has resumed. Again, its best to <a href="https://github.com/murraycu/android-galaxyzoo/commit/ee65f7b704a7a425cd1d0d6380c1433ab9482d02">cause the commit of the fragment transaction in the parent activity’s onResumeFragments() </a>because there’s nowhere suitable to do that in the fragment. The code could be much simpler if there was just somewhere safe in the Fragment to do this.</p>\n<p>I believe that this problem hits every Android app developer who ever had more than a handful of users. It feels like a failure in the Android API design and the fixes feel like workarounds. If there was any clear way to structure app code to avoid this from the start then that would be mentioned early in the developer documentation.</p>\n<h3>Mutiple onLoadFinished() calls</h3>\n<p>If you use a ContentProvider (as I think you <a href="http://www.murrayc.com/permalink/2014/06/17/android-glom-experiments/">should</a>) then you’ll use a Cursor Loader to get its data, overriding onCreateLoader() and onLoadFinished() and calling getLoaderManaged().restartLoader().</p>\n<p>However, you will notice that your onLoadFinished() is often called more than once, sometimes with older data, confusing your app. This can be avoided by calling getLoaderManager.destroyLoader() in your onLoadFinished. For <a href="https://github.com/murraycu/android-galaxyzoo/commit/3438f8a2f639699e6f026f4daa8531190d547f55">instance</a>. I’m fairly sure this is an Android bug – at the least it is a poorly documented and unforgiving aspect of the API.</p>\n<h3>ConcurrentModificationException</h3>\n<p>I had at least one <a href="https://github.com/murraycu/android-galaxyzoo/issues/15">crash report with a ConcurrentModificationException</a>, suggesting that two threads were changing the same data at the same time though I thought I had designed my code to avoid that and I thought I had made the class mostly immutable. So to avoid any chance of sharing data between threads <a href="https://github.com/murraycu/android-galaxyzoo/commit/b938717baa74c96e22e30686860564b5270ec37f">I did some defensive copying </a>(and <a href="https://github.com/murraycu/android-galaxyzoo/commit/60bcad361d4d75c8f294d47ba05fbfead942567d">here</a>). I haven’t seen the crash since.</p>\n<h3>Toolbar’s Up button doesn’t act like the Back button</h3>\n<p>Android has a standard Back button that most users understand. It generally takes the user to the previous screen (activity), and that previous screen will look like it last looked for them.\xa0 But Android also has the concept of an Up button which few users understand.</p>\n<p>The Up button is usually at the left of the app’s top toolbar (appbar) and it usually looks like a Back button. But it’s not a Back button. It takes the user to the parent level of the app instead of stepping back through all the previous screens that the user has traveled through since they were last at the top-level. Of course, most users don’t have any concept of the app having a hierarchy of screens in addition to a history of sibling screens. I predict that the Up button idea will be removed from Android one day.</p>\n<p>At a second-level activity (something opened from the top-level), a user can justifiably expect the Back button and Up button to have the same effect – take me to the previous (top-level) screen/activity – even if the user knows about the Back/Up difference. However, by default the Up button will start a new parent activity instead of going back to the previous instance of that activity (as Back would). Users experience this as a loss of data – for instance this <a href="https://github.com/murraycu/android-galaxyzoo/issues/6#issuecomment-64186721">bug</a> and this <a href="https://github.com/murraycu/android-galaxyzoo/issues/14">bug</a>.</p>\n<p>The fix for this depends on the situation:</p>\n<ul>\n<li>In your Up button handler, you can resume your parent activity by <a href="https://github.com/murraycu/android-galaxyzoo/commit/a910d80663ce38ab125223ee9e51512e4ebbe888">passing FLAG_ACTIVITY_CLEAR on an intent that you pass to N<span class="blob-code-inner"><span class="pl-smi">avUtils</span><span class="pl-k">.</span>navigateUpTo</span>()</a>, instead of recreating the activity by just calling <span class="blob-code-inner"><span class="pl-c">NavUtils.navigateUpFromSameTask</span></span>().</li>\n<li>If you know that your top-level parent activity should never have more than one instance, because it can only ever show the one true set of data, you can prevent multiple instances of the activity from being instantiated, by setting <a href="https://github.com/murraycu/android-galaxyzoo/commit/da1347454e0c0f2d7e6c9dd220931e1bd8baeb53">launchMode=singleTop in your AndroidManifest.xm</a>l.</li>\n</ul>\n<h3>Duplicated child fragments</h3>\n<p>My app uses child fragments (fragments in a fragment), which Android needs us to add in code rather than in the layout XML file. Strangely, I sometimes saw duplicate fragments thought it was hard to reproduce it reliably. The answer was to\xa0<a href="https://github.com/murraycu/android-galaxyzoo/commit/7dd2af782464760c6541f694e1ba123180784459"> always use FragmentTransaction.replace() instead of add()</a>.</p>\n<p>\xa0</p></div>\n </div>', 'title': 'android-galaxyzoo: Fixing typical Android bugs', 'date': <GDateTime at 0x5606cd413b60>, 'author_homepage': None, 'url': 'http://www.murrayc.com/permalink/2015/07/14/android-galaxyzoo-fixing-typical-android-bugs/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16cb048 (TrackerDBCursor at 0x5606cda4df60)>), returned {'fullname': 'hughsie', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Inside a windows driver package you’ll probably see a few <code>.dll</code>‘s, a <code>.inf</code> file and a <code>.cat</code> file. If you’ve ever been curious in Windows you’ll have double clicked it and it would show some technical information about the driver and some information about who signed the file.</p>\n<p><img class="aligncenter" height="483" src="http://didierstevens.files.wordpress.com/2008/01/sp2-cat-tab1.png" width="409"/></p>\n<p>We want to use this file to avoid having to get vendors to manually sign the firmware file with a GPG detached signature, which also implies trusting the Microsoft WHQL certificate. These are my notes on my <em>adventure</em> so far.</p>\n<p>There are not many resources on this stuff, and I’d like to thank dwmw2 and dhowels for all their help so far answering all my stupid questions. <a href="https://github.com/theuni/osslsigncode">osslsigncode</a> is also useful to see how other signing is implemented.</p>\n<p>So, the basics. A .cat file is a SMIME PKCS DER file. We can dump the file using:</p>\n<pre>openssl asn1parse -in ecfirmware.cat -inform DER\n</pre>\n<p>and if we were signing just one file we should be able to verify the <code>.cat</code> file with something like this:</p>\n<pre>wget http://www.microsoft.com/pki/certs/MicRooCerAut_2010-06-23.crt\nopenssl x509 -in MicRooCerAut_2010-06-23.crt -inform DER -out ms/msroot.pem -outform PEM\ncat ms/*.pem &gt; ms/certs.pem\nopenssl smime -verify -CAfile ms/certs.pem -in ecfirmware.cat -inform DER -attime $(date +%s --date=2015-01-01) -content ECFirmware.38.7.50.0.cap\nVerification failed\n</pre>\n<p>(Ignore the need to have the root certificate for now, that seems to be a bug in OpenSSL and they probably have bigger fires to fight at this point)</p>\n<p>…but it’s not. We have a pkcs7-signed blob and we need to work out how to get the signature to actually *match* and then we have to work out how to interpret the pkcs7-signed data blob, and use the sha256sums therein to validate the actual data. OpenSSL doesn’t know how to interpret the MS content type OID (1.3.6.1.4.1.311.10.1) so it wimps out and doesn’t put any data into the digest at all.</p>\n<p>We can get the blob using a simple:</p>\n<pre>dd if=ecfirmware.cat of=ecfirmware.cat.payload bs=1 skip=66 count=1340\n</pre>\n<p>…which now verifies:</p>\n<pre>openssl smime -verify -CAfile ms/certs.pem -in ecfirmware.cat -inform DER -attime $(date +%s --date=2015-01-01) -content ecfirmware.cat.payload\nVerification successful\n</pre>\n<p>The blob appears to be a few tables of UTF-16 filename and SHA1/SHA256 checksummed data, encoded in ASN.1 notation. I’ve spent quite a few evenings decompiling the DER file into an ASN file without a whole lot of success (there are 14(!) layers of structures to contend with) and I’ve still not got an ASN file that can correctly parse my DER file for my simple unsigned v1 (<em>ohh yes</em>, v1 = SHA1, v2 = SHA256) test files. There is also a lot of junk data in the blob, and some questionable design choices which mean it’s a huge pain to read. Even if I manage to write the code to read the <code>.cat</code> data blob I’ve then got to populate the data (including the junk data…) so that Windows will accept my file to avoid needing a Microsoft box to generate all firmware images. Also add to the mix that the ASN.1 data is different on different Windows versions (with legacy versions overridden), which explains why you see things like <code>1.3.6.1.4.1.311.12.2.2</code> rather than translated titles in the catalog viewer in Windows XP when trying to view <code>.cat</code> files created on Windows 7.</p>\n<p>I’ve come to the conclusion that writing a library to reliably read and write all versions of <code>.cat</code> files is probably about 3 months work, and that’s 3 months I simply don’t have. Given there isn’t actually a specification (apart from a <a href="https://msdn.microsoft.com/en-us/library/aa380252(v=VS.85).aspx#catalog_definition_functions">super small guide</a> on how to use the MS crypto API) it would also be an uphill battle with every Windows release.</p>\n<p>We could of course do something Linux specific that does the same thing, although that obviously would not work on Windows and means we have to ask the vendors to do an extra step in release engineering. Using GPG would be easiest, but a lot of the hardware vendors seem wed to the PKCS certificate mechanism, and I suppose it does mean you can layer certificates for root trust, vendors and contractors. GPG signing the firmware file only doesn’t actually give us a file-list with the digest values of the other metadata in the .cab file.</p>\n<p>A naive solution would be to do something like this:</p>\n<pre>sha25sum firmware.inf firmware.metainfo.xml firmware.bin &gt; firmware.digest\nopenssl dgst -sha256 -sign cert-private.pem -out firmware.sign firmware.digest\nopenssl dgst -sha256 -verify cert-pubkey.pem -signature firmware.sign firmware.files\n</pre>\n<p>But to actually <em>extract</em> the firmware.digest file we need the <strong>private key</strong>. We can check prepared data using the public key, but that means shipping firmware.digest <em>and</em> firmware.sign when we only really want one file (.cab files checksum the files internally, so we can be sure against data corruption).</p>\n<p>Before I go crazy and invent yet another file format specification does anybody know of a signed digest format with an open specification? Better ideas certainly welcome, thanks.</p>\n<p>Richard.</p></div>\n </div>', 'title': 'Building a better catalog file', 'date': <GDateTime at 0x5606cd3fccc0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/hughsie/2015/07/14/building-a-better-catalog-file/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16cb048 (TrackerDBCursor at 0x5606cda4df60)>), returned {'fullname': 'karen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m back from Brazil where I attended FISL. I had the honor of presenting three talks! And they were three of my favorite topics: <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507081907.ogv"> the importance of compliance and the suit against VMware</a>, <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507101600.ogv">bringing more women to free and open source software</a> and <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507111100.ogv">why I care so much about software freedom in the first place</a>. It was a very fun conference. Besides doing the talks I was able to do a few press interviews too. And of course I loved meeting Brazilian hackers and software freedom activists. </p>\n<p>Attendees seemed very interested in enforcement and the <a href="http://sfconservancy.org/linux-compliance/">VMware suit</a>. I was happy to see support for this work, and there was discussion about local copyright holders signing up to the coalition. It really seems that folks are starting to see the downsides of noncopylefted projects and are frustrated by the pervasiveness of GPL violations. </p>\n<p>One of my favorite moments of the conference was the response to my talk about gender diversity. I admit that it’s disappointing that this talk is always attended disporportionately by women. As I sometimes say in the talk itself, it doesn’t make a lot of sense for the burden of this work to fall only on women. There are so few women right now in free software (1-11% at most) that it would be impossible for us to do it on any meaningful scale alone. Plus it’s not fair to expect women to undertake this work on top of their other contributions to free software (many women understandably don’t want to think about gender issues at all). Men can make a tremendous impact on this area. Most of our Outreachy mentors are men, and as the dominant group in free and open surce software, it’s men who can fundamentally change the culture to be more welcoming to women and other underrepresented groups. Nonetheless, it was amazing that the “mob” after my talk was mostly women. It was great to meet so many women who are leaders in Latin America and to hear about their extraordinary work. I was interviewed after the talk and was askd to give some<a href="https://www.youtube.com/watch?v=wy5Xkhywh84"> tips for women getting started in free software.</a></p>\n<p>The conference had a very different feel to it than a lot of the other conferences I attend. It was a community run conference (along with that awesome community feeling, a lot of students, etc.) but it’s such a big conference that it has some things that community conferences often don’t have. Like GNU and Tux mascots (thanks to Deb Nicholson for the photo)!</p>\n<p><a href="https://blogs.gnome.org/gnomg/files/2015/07/karengnutux.jpg"><img alt="karengnutux" class="alignnone size-full wp-image-793" src="https://blogs.gnome.org/gnomg/files/2015/07/karengnutux.jpg" width="550"/></a></p>\n<p>I loved seeing schoolkids excited to be there and quite a number of really little kids with GNU and Freedo shirts and toys.</p>\n<p>There was also a lot of love for GNOME, and it was great to meet up with people I don’t get to see very often, especially since I’m missing <a href="https://2015.guadec.org/">GUADEC this year. Plus we got to </a><a href="https://www.youtube.com/watch?v=zUyUWodqPm8&amp;feature=youtu.be">settle some outstanding Linux kernel/systemd issues</a>.</p>\n<p>FISL is an excellect conference – a wonderful alternative to the corporate trade association conference ciruit. I hope to be able to return some time in the future. Now to get ready for OSCON next week…</p></div>\n </div>', 'title': 'FISL16', 'date': <GDateTime at 0x5606cd3f5c20>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/gnomg/2015/07/14/fisl16/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16cb048 (TrackerDBCursor at 0x5606cda4df60)>), returned {'fullname': 'Jesse van den Kieboom', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m using the thunderbird conversations add-on and am generally quite happy with it. One pain point however is that its quick reply feature has a really small text area for replying. This is especially annoying if you want to reply in-line and have to scroll to relevant parts of the e-mail.</p>\n<p>A quick fix for this:</p>\n<ol>\n<li>Install the Stylish thunderbird add-on</li>\n<li>Add the following style snippet:\n<pre>.quickReply .textarea.selected {\n height: 400px !important;\n}</pre>\n</li>\n</ol>\n<p>Adjust height as preferred.</p></div>\n </div>', 'title': 'Making thunderbird conversations quick reply area larger', 'date': <GDateTime at 0x5606cd3fa4a0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/jessevdk/2015/07/15/making-thunderbird-conversations-quick-reply-area-larger/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16cb048 (TrackerDBCursor at 0x5606cda4df60)>), returned {'fullname': 'felipeborges', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p/>\n<p>A nice feature Apple has is the ability of accessing a window-specific dialog right from their title bar.</p>\n<p><a href="https://pbs.twimg.com/media/CH0hIGRWIAAe2LC.png:large"><img alt="" class="aligncenter" height="230" src="https://pbs.twimg.com/media/CH0hIGRWIAAe2LC.png:large" width="582"/></a></p>\n<p>\xa0</p>\n<p>I think that would be pretty useful in Documents’ context as well. So I’ve written this <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751189" target="_blank">small patch</a>.</p>\n<p>I’ve been pointed out that it duplicates the access to the Properties dialog. We already have that on the hamburger menu. But still, I think that would be cool. <strong>What do you think?</strong></p></div>\n </div>', 'title': 'Documents idea: rename documents right from the title bar', 'date': <GDateTime at 0x5606cd403600>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/felipeborges/proposal-proprierties-title-bar/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16cb048 (TrackerDBCursor at 0x5606cda4df60)>), returned {'fullname': 'felipeborges', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The GNOME Project has released GNOME 3.12 today.\xa0Congratulations to all the approximately 1140 contributors\xa0that made 34236\xa0really awesome changes in this release.</p>\n<p>Bastian Hougaard and Karen Sandler (GNOME Executive Director) have made an<em> Introducing GNOME 3.12</em> video, check it out!</p>\n<p>Don’t forget to check the <a href="https://help.gnome.org/misc/release-notes/3.12/" target="_blank" title="GNOME 3.12 Release notes">release notes</a>. If you’re a hardcore Fedora user, you can get GNOME 3.12 using <a href="https://copr.fedoraproject.org/coprs/rhughes/f20-gnome-3-12/" target="_blank" title="rhughes / f20-gnome-3-12">Richard Hughes’ rpm\xa0repository</a>.</p></div>\n </div>', 'title': 'GNOME 3.12 Released!', 'date': <GDateTime at 0x5606cd406320>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/felipeborges/gnome-3-12-released/', 'is_read': False, 'author_email': None}
15:25:13 DEBUG tracker.py:285 |||||gnomenews.tracker.parse_sparql(<__main__.TrackerDBCursor object at 0x7f7fa16cb048 (TrackerDBCursor at 0x5606cda4df60)>), returned {'fullname': 'Adrien Plazas', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Lasse and I spent some time recently to produce a Beamer template for GUADEC 2015. You can find it here: <a href="https://github.com/sils1297/guadec-presentation-templates">github.com/sils1297/guadec-presentation-templates</a>.</p> <div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-6PW1Sb5MY1E/VaZ-dFjlg8I/AAAAAAAAAIo/aU3mEN-XNoE/s1600/guadec-2015-beamer-title.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-6PW1Sb5MY1E/VaZ-dFjlg8I/AAAAAAAAAIo/aU3mEN-XNoE/s480/guadec-2015-beamer-title.png"/></a></div> <p>You can use it with Pandoc or directly with LaTeX. Example are shipped too:</p><ul> <li><b>2015/presentation.md</b> is a Pandoc example, build it with <b>make pandoc</b> to produce <b>2015/presentation.pdf</b>;</li> <li>2015/guadec-example.tex is a LaTeX example, build it with <b>make tex</b> to produce <b>2015/guadec-example.pdf</b>.</li></ul> <div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-aRFsmgeMhlc/VaZ-deyNkVI/AAAAAAAAAIs/ZBjM9z9sSBo/s1600/guadec-2015-beamer-slide.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-aRFsmgeMhlc/VaZ-deyNkVI/AAAAAAAAAIs/ZBjM9z9sSBo/s480/guadec-2015-beamer-slide.png"/></a></div> <p>I hope you\'ll enjoy it, feedback is welcome and if you have any problem don\'t hesitate to contact me (Kekun) or Lasse (sils) GIMPNet <a href="irc://irc.gimp.org/#guadec">#guadec on GIMPNet</a>.</p></div>\n </div>', 'title': 'GUADEC 2015 get its Beamer template!', 'date': <GDateTime at 0x5606cd3f0c00>, 'author_homepage': 'https://plus.google.com/112791072160767246710', 'url': 'http://bytesgnomeschozo.blogspot.com/2015/07/guadec-2015-get-its-beamer-template.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}
15:25:13 DEBUG tracker.py:164 ||||gnomenews.tracker.get_posts_for_channel(<Tracker object at 0x7f7fa16a67e0 (gnomenews+tracker+Tracker at 0x5606cd3ec7a0)>, 'https://planet.gnome.org/atom.xml', 10), returned [{'fullname': 'Jakub Brindza', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It seemed to take forever. Endless PR reviews, improvements, code refactoring and hours spent working on editor, removing deprecated icons or search.<br/><br/>However, at the beginning of this week I finally managed to get the pull requests to a state when they could be merged. As a consequence, Getting Things GNOME! now features (well, from 99% I dare to say) most up-to-date widgets and properties. Moreover, master version is now boosted with re-designed editor window as you can see from the photo here:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-P4VIu-UTPX0/VZ_SYuDT8wI/AAAAAAAAEH8/ti8zCCQIXWM/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B16.09.21.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://3.bp.blogspot.com/-P4VIu-UTPX0/VZ_SYuDT8wI/AAAAAAAAEH8/ti8zCCQIXWM/s400/Screen%2BShot%2B2015-07-10%2Bat%2B16.09.21.png" width="400"/></a></div><div class="separator" style="clear: both; text-align: center;"><br/></div><div class="separator" style="clear: both; text-align: left;">As for another challenge I decided to face in my summer experience, I chose to refurbish preferences.</div><div class="separator" style="clear: both; text-align: left;">All in all, the beginnings were not that tough. Currently, my version features re-newed implementation of the general settings.</div><div class="separator" style="clear: both; text-align: left;">In the (very soon) future, I\'ll moreover be implementing also the plugins and synchronisation services in the same preferences window. This way, users will be experiencing a much simpler to use and friendlier environment when it comes to customisation of the app.</div><div class="separator" style="clear: both; text-align: left;"><br/></div><div class="separator" style="clear: both; text-align: left;">Without some exhausting descriptions, take a look at the current additions to the Getting Things GNOME!</div><div class="separator" style="clear: both; text-align: left;"><br/></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-CoU4QWjHmLg/VZ_Tpu8rpSI/AAAAAAAAEIU/DhgjcoG2u1k/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.58.55.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="http://3.bp.blogspot.com/-CoU4QWjHmLg/VZ_Tpu8rpSI/AAAAAAAAEIU/DhgjcoG2u1k/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.58.55.png" width="400"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Preferences window now features side menu for three major categories and main window to view particular settings</td></tr></tbody></table><br/><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-LIXHRLPYK3Q/VZ_TpCtKfaI/AAAAAAAAEIM/twl3lFVCIYQ/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.02.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="http://4.bp.blogspot.com/-LIXHRLPYK3Q/VZ_TpCtKfaI/AAAAAAAAEIM/twl3lFVCIYQ/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.02.png" width="400"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Plugins and Synchronisation services. Coming soon!</td></tr></tbody></table><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-sf2kZIa1C2I/VZ_TnxplIUI/AAAAAAAAEII/De2Z-mwa-mQ/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.05.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://4.bp.blogspot.com/-sf2kZIa1C2I/VZ_TnxplIUI/AAAAAAAAEII/De2Z-mwa-mQ/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.05.png" width="400"/></a></div><div class="separator" style="clear: both; text-align: left;"><br/></div><br/>In Plugins window, the plan is to re-make entirely the current way of viewing individual plugins. I will be trying to get rid of the treeview and place each plugin in a separate GtkBox. I\'m particularly looking forward to this. The reason is that I have not yet tried to create one general widget that would be applied to all the elements, but rather created all the individual elements. This was both inefficient and exhausting, so I\'d love to learn how to apply the same pattern to several places.<br/><br/>As for the synchronisation services, I\'m sure you\'ll notice some refurbishments here, too, in a short period of time.<br/><br/>The overall aim is to produce a simple, sleek and easy-to-use interface that will be 100% functional and bring Getting Things GNOME again a bit closer to GNOME 3 standards.<br/><br/>I love the changes and so I hope you do as well.<br/><br/>On the other hand, for the past few hours I\'ve been trying to make parents viewing feature in Task Editor functional, since this was one of the features which lacked in <a href="http://www.jakubbrindza.com/2015/06/another-huge-leap-for-gtg.html" target="_blank">my last PR</a>, even though the UI is present. Not many break-throughs in there so far though.<br/>Getting Things GNOME features a function get_parents() whose name I found rather misleading since I found out that it does not give you a list of all parents a task may have (assuming it\'s a task of level 2+), but it gives you only the most direct, one-level-up parent. This makes the entire problem a bit more difficult since I cannot easily, let\'s say, make an array that would hold all the names (or task id\'s) of a task\'s parents which would then be placed into a popover.<br/>This may be tough, but it\'s a core feature which needs to be implemented, so I want to work on it.<br/><br/>Stay tuned!</div>\n </div>', 'title': 'GTG Preferences -- REMADE!', 'date': <GDateTime at 0x5606cd3fa180>, 'author_homepage': 'http://www.blogger.com/profile/12785763043249070999', 'url': 'http://www.jakubbrindza.com/2015/07/gtg-preferences-remade.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}, {'fullname': 'Allan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>So <a href="https://mail.gnome.org/archives/foundation-announce/2015-June/msg00003.html">this</a> happened. It’s the first time I’ve served on the Foundation’s Board of Directors, and I thought it would be good to write about the experience.</p>\n<p>The GNOME Foundation Board can often be a bit opaque. Generally it works in the background, and while you can get a sense of some of its activities through <a href="https://wiki.gnome.org/FoundationBoard/Minutes">the minutes</a>, it is easy to forget that the board is out there doing its thing. </p>\n<p>It has been a bit of a revelation to see just how active the board is. It’s a bit like I’ve discovered a new, secret world inside the GNOME project. And there’s a lot happening in this world – it is always busy.</p>\n<p>There’s an IRC channel and several private mailing lists, which are very active. And there are tasks being taken care of all the time – I already have a list of three or four things that I’m sorting out, for example.</p>\n<p>I was impressed by the first board meeting I participated in. There was a clear agenda that was followed, minutes were recorded as the meeting went on, and the meeting ran to time. Many of the agenda items weren’t particularly glamorous, but they were things that need to be done, and there was a good level of scrutiny around each one.</p>\n<p>There have been a few other things that have surprised me about the board. I wasn’t fully aware of how institutionalised it is. We are governed by our <a href="https://www.gnome.org/wp-content/uploads/2012/02/bylaws.pdf">bylaws</a>, which set out how the board has to operate, as well as some of its obligations. I read them recently, and was surprised by a couple of things that are in there. If you’re a Foundation member, you might be interested to take a look.</p>\n<p>Another thing is just how important Rosanna is to the board. For those who don’t know, Rosanna is the Foundation’s Director of Operations. Not only does she take care of a lot of the Foundation’s adminstration, but she is a valuable source of knowledge and expertise, having worked for the Foundation for numerous years. She’s another one of those aspects of the Foundation that is both important and, often, hidden from view.</p>\n<p>I’m still busy learning the ropes, and there’s a lot I have to learn. So far it is satisfying work though, and good to see another side of the GNOME project.</p></div>\n </div>', 'title': 'Diary of a new board member', 'date': <GDateTime at 0x5606cd3f6100>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/aday/2015/07/13/diary-of-a-new-board-member/', 'is_read': False, 'author_email': None}, {'fullname': 'shaunm', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The <a href="https://conf.openhelp.cc/">Open Help Conference &amp; Sprints</a> is happening again this year. Open Help is the only event focused on open source documentation and support. It features a two-day conference with a mix of presentations, demos, and open discussions. This format has proven very popular, and really helps people find real solutions to improve their documentation. The conference this year is September 26-27. (But don’t miss the amazing reception September 25!)</p>\n<p>After the conference, Open Help hosts three days of multiple-team sprints. The sprints are September 28-30 this year. Open Help has hosted doc sprints for teams like GNOME, Mozilla, FreeBSD, Wikipedia, WordPress, OpenMRS, and WebPlatform.org. In many cases, Open Help was a team’s first exposure to having a sprint.</p>\n<p>I wrote an <a href="http://opensource.com/community/15/7/five-lessons-open-help-doc-sprints">article on opensource.com</a> about the Open Help doc sprints, along with five tips on holding a successful sprint.</p>\n<p>Documentation is important. This is the fifth year that Open Help will be helping open source teams create better documentation. <strong>But we need your help.</strong> Please spread the word about Open Help to any communities you’re involved with. Send mail to mailing lists. Tweet. Tell your friends. Get the word out however you can.</p>\n<p>Open Help is only great because of the people who come.</p></div>\n </div>', 'title': 'Come to Open Help. Have a Doc Sprint.', 'date': <GDateTime at 0x5606cd3fdcc0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/shaunm/2015/07/13/come-to-open-help-have-a-doc-sprint/', 'is_read': False, 'author_email': None}, {'fullname': 'murrayc', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>My <a href="https://github.com/murraycu/android-galaxyzoo/">Galaxy Zoo app for android</a> has been on the Play store for several months now and seems to be generally well liked. So far it has around 800 users, increasing slowly and linearly, probably because it isn’t linked from the galaxyzoo.org website. But even the first hundred users were enough to show me several problems that I needed to fix. I’ve written about them here, with links to the commits that fixed them in my app, because other app developers will experience them too.</p>\n<p>These were general Android development problems, not specific to android-galaxyzoo. I guess that this is the difference between someone who understands how the Android API should be used, and someone who has actually used it with real users. It shouldn’t be quite this difficult.</p>\n<h3>Work in the main thread (Strict Mode)</h3>\n<p>Your code should not perform long-running tasks, such as network or disk IO, in the main thread, because UIs should not be unresponsive. By enabling Strict Mode in your code, you can make this cause exceptions, turning a non-responsive app into a crashing app. It would be unwise to turn this on in your app’s release version.</p>\n<p>However, some “power” users seem to have this on via the developer options. They probably experience instability in many apps. And Android 3.0 (Honeycomb) has some Strict Mode settings on <a href="http://developer.android.com/reference/android/os/StrictMode.ThreadPolicy.Builder.html#penaltyDeathOnNetwork%28%29">by default</a>. So you will get crash reports via the Google Play store if you ignore Strict Mode exceptions.</p>\n<p>As I mentioned in my <a href="http://www.murrayc.com/permalink/tag/android/">previous entry</a>, AccountManager is <a href="http://developer.android.com/reference/android/accounts/AccountManager.html#getAccountsByType%28java.lang.String%29">documented as being safe for use on the Main UI Thread</a>, but it’s not, so I needed to <a href="https://github.com/murraycu/android-galaxyzoo/commit/426918f8c43e5aab0c9946c6fa7e8eebe2f5b531">use the AccountManager via AsyncTask</a>.</p>\n<p>If you are using a ContentProvider, you should not try to store data in the ContentProvider in the main thread. I instead <a href="https://github.com/murraycu/android-galaxyzoo/commit/6a18ce07c4ad136eed94c6d8a9d8eaec96bb303e">did that via AsyncTask.</a></p>\n<p>Likewise, <a href="https://github.com/murraycu/android-galaxyzoo/commit/fdef5fdba83d6ef4dd767e728a08378e294bc631">avoid calling BitmapFactory.decodeStream() in the main thread</a>, though it’s easier to <a href="https://github.com/murraycu/android-galaxyzoo/commit/009ddd077968f1a2feac4de196ec814a74017c62">just use Picasso</a> anyway.</p>\n<h3>Automatic cache deletion</h3>\n<p>Your app probably caches some data, such as images, in its cache directory, such as the <a href="http://developer.android.com/reference/android/content/Context.html#getExternalCacheDir%28%29">getExternalCacheDir()</a> directory (/storage/sdcard/Android/data/com.you.yourapp/cache). However, Android will delete those files whenever it needs the space, and it won’t explicitly tell your app that it’s happened. So you need to check that your cached files really exist, one by one. You can either check the files when you first try to use them (causing UI delay) or you can check in the background, maybe trying to re-download the files.</p>\n<p>This confused my code completely and it was hard to identify the cause of the resulting <a href="https://github.com/murraycu/android-galaxyzoo/issues/12">bug</a> because the cache deletion by the system was not triggered by any particular action in my app.</p>\n<p>By the way, although the <a href="http://developer.android.com/reference/android/content/Context.html#getExternalCacheDir%28%29">getExternalCacheDir() documentation</a> says that you don’t need to request permission to use that (app’s own) directory since Android 4.4 (KitKat), that’s not true – you do <a href="http://stackoverflow.com/questions/27016647/why-do-i-need-the-write-external-storage-permission-with-getexternalcachedir-o">need to request the permission on Android 5.0 (Lollipop)</a>.</p>\n<h3>IllegalStateException: Can not perform this action after onSaveInstanceState</h3>\n<p>There are things that you cannot do in between an activity’s state being saved and that activity being resumed. It’s hard to know when that is the case but if you get it wrong then your app will crash. Here’s a <a href="http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html">full explanatio</a>n, though you’ll wish you didn’t have to bother with it.</p>\n<p>For instance, you should delay any use of AlertDialog until the parent activity’s onResumeFragments, which I did <a href="https://github.com/murraycu/android-galaxyzoo/commit/012b88c13d9f082fc99d0dee9e5b196f94ff5d60">like so</a>.</p>\n<p>Likewise, you should not commit fragment transactions until after your activity has resumed. Again, its best to <a href="https://github.com/murraycu/android-galaxyzoo/commit/ee65f7b704a7a425cd1d0d6380c1433ab9482d02">cause the commit of the fragment transaction in the parent activity’s onResumeFragments() </a>because there’s nowhere suitable to do that in the fragment. The code could be much simpler if there was just somewhere safe in the Fragment to do this.</p>\n<p>I believe that this problem hits every Android app developer who ever had more than a handful of users. It feels like a failure in the Android API design and the fixes feel like workarounds. If there was any clear way to structure app code to avoid this from the start then that would be mentioned early in the developer documentation.</p>\n<h3>Mutiple onLoadFinished() calls</h3>\n<p>If you use a ContentProvider (as I think you <a href="http://www.murrayc.com/permalink/2014/06/17/android-glom-experiments/">should</a>) then you’ll use a Cursor Loader to get its data, overriding onCreateLoader() and onLoadFinished() and calling getLoaderManaged().restartLoader().</p>\n<p>However, you will notice that your onLoadFinished() is often called more than once, sometimes with older data, confusing your app. This can be avoided by calling getLoaderManager.destroyLoader() in your onLoadFinished. For <a href="https://github.com/murraycu/android-galaxyzoo/commit/3438f8a2f639699e6f026f4daa8531190d547f55">instance</a>. I’m fairly sure this is an Android bug – at the least it is a poorly documented and unforgiving aspect of the API.</p>\n<h3>ConcurrentModificationException</h3>\n<p>I had at least one <a href="https://github.com/murraycu/android-galaxyzoo/issues/15">crash report with a ConcurrentModificationException</a>, suggesting that two threads were changing the same data at the same time though I thought I had designed my code to avoid that and I thought I had made the class mostly immutable. So to avoid any chance of sharing data between threads <a href="https://github.com/murraycu/android-galaxyzoo/commit/b938717baa74c96e22e30686860564b5270ec37f">I did some defensive copying </a>(and <a href="https://github.com/murraycu/android-galaxyzoo/commit/60bcad361d4d75c8f294d47ba05fbfead942567d">here</a>). I haven’t seen the crash since.</p>\n<h3>Toolbar’s Up button doesn’t act like the Back button</h3>\n<p>Android has a standard Back button that most users understand. It generally takes the user to the previous screen (activity), and that previous screen will look like it last looked for them.\xa0 But Android also has the concept of an Up button which few users understand.</p>\n<p>The Up button is usually at the left of the app’s top toolbar (appbar) and it usually looks like a Back button. But it’s not a Back button. It takes the user to the parent level of the app instead of stepping back through all the previous screens that the user has traveled through since they were last at the top-level. Of course, most users don’t have any concept of the app having a hierarchy of screens in addition to a history of sibling screens. I predict that the Up button idea will be removed from Android one day.</p>\n<p>At a second-level activity (something opened from the top-level), a user can justifiably expect the Back button and Up button to have the same effect – take me to the previous (top-level) screen/activity – even if the user knows about the Back/Up difference. However, by default the Up button will start a new parent activity instead of going back to the previous instance of that activity (as Back would). Users experience this as a loss of data – for instance this <a href="https://github.com/murraycu/android-galaxyzoo/issues/6#issuecomment-64186721">bug</a> and this <a href="https://github.com/murraycu/android-galaxyzoo/issues/14">bug</a>.</p>\n<p>The fix for this depends on the situation:</p>\n<ul>\n<li>In your Up button handler, you can resume your parent activity by <a href="https://github.com/murraycu/android-galaxyzoo/commit/a910d80663ce38ab125223ee9e51512e4ebbe888">passing FLAG_ACTIVITY_CLEAR on an intent that you pass to N<span class="blob-code-inner"><span class="pl-smi">avUtils</span><span class="pl-k">.</span>navigateUpTo</span>()</a>, instead of recreating the activity by just calling <span class="blob-code-inner"><span class="pl-c">NavUtils.navigateUpFromSameTask</span></span>().</li>\n<li>If you know that your top-level parent activity should never have more than one instance, because it can only ever show the one true set of data, you can prevent multiple instances of the activity from being instantiated, by setting <a href="https://github.com/murraycu/android-galaxyzoo/commit/da1347454e0c0f2d7e6c9dd220931e1bd8baeb53">launchMode=singleTop in your AndroidManifest.xm</a>l.</li>\n</ul>\n<h3>Duplicated child fragments</h3>\n<p>My app uses child fragments (fragments in a fragment), which Android needs us to add in code rather than in the layout XML file. Strangely, I sometimes saw duplicate fragments thought it was hard to reproduce it reliably. The answer was to\xa0<a href="https://github.com/murraycu/android-galaxyzoo/commit/7dd2af782464760c6541f694e1ba123180784459"> always use FragmentTransaction.replace() instead of add()</a>.</p>\n<p>\xa0</p></div>\n </div>', 'title': 'android-galaxyzoo: Fixing typical Android bugs', 'date': <GDateTime at 0x5606cd413b60>, 'author_homepage': None, 'url': 'http://www.murrayc.com/permalink/2015/07/14/android-galaxyzoo-fixing-typical-android-bugs/', 'is_read': False, 'author_email': None}, {'fullname': 'hughsie', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Inside a windows driver package you’ll probably see a few <code>.dll</code>‘s, a <code>.inf</code> file and a <code>.cat</code> file. If you’ve ever been curious in Windows you’ll have double clicked it and it would show some technical information about the driver and some information about who signed the file.</p>\n<p><img class="aligncenter" height="483" src="http://didierstevens.files.wordpress.com/2008/01/sp2-cat-tab1.png" width="409"/></p>\n<p>We want to use this file to avoid having to get vendors to manually sign the firmware file with a GPG detached signature, which also implies trusting the Microsoft WHQL certificate. These are my notes on my <em>adventure</em> so far.</p>\n<p>There are not many resources on this stuff, and I’d like to thank dwmw2 and dhowels for all their help so far answering all my stupid questions. <a href="https://github.com/theuni/osslsigncode">osslsigncode</a> is also useful to see how other signing is implemented.</p>\n<p>So, the basics. A .cat file is a SMIME PKCS DER file. We can dump the file using:</p>\n<pre>openssl asn1parse -in ecfirmware.cat -inform DER\n</pre>\n<p>and if we were signing just one file we should be able to verify the <code>.cat</code> file with something like this:</p>\n<pre>wget http://www.microsoft.com/pki/certs/MicRooCerAut_2010-06-23.crt\nopenssl x509 -in MicRooCerAut_2010-06-23.crt -inform DER -out ms/msroot.pem -outform PEM\ncat ms/*.pem &gt; ms/certs.pem\nopenssl smime -verify -CAfile ms/certs.pem -in ecfirmware.cat -inform DER -attime $(date +%s --date=2015-01-01) -content ECFirmware.38.7.50.0.cap\nVerification failed\n</pre>\n<p>(Ignore the need to have the root certificate for now, that seems to be a bug in OpenSSL and they probably have bigger fires to fight at this point)</p>\n<p>…but it’s not. We have a pkcs7-signed blob and we need to work out how to get the signature to actually *match* and then we have to work out how to interpret the pkcs7-signed data blob, and use the sha256sums therein to validate the actual data. OpenSSL doesn’t know how to interpret the MS content type OID (1.3.6.1.4.1.311.10.1) so it wimps out and doesn’t put any data into the digest at all.</p>\n<p>We can get the blob using a simple:</p>\n<pre>dd if=ecfirmware.cat of=ecfirmware.cat.payload bs=1 skip=66 count=1340\n</pre>\n<p>…which now verifies:</p>\n<pre>openssl smime -verify -CAfile ms/certs.pem -in ecfirmware.cat -inform DER -attime $(date +%s --date=2015-01-01) -content ecfirmware.cat.payload\nVerification successful\n</pre>\n<p>The blob appears to be a few tables of UTF-16 filename and SHA1/SHA256 checksummed data, encoded in ASN.1 notation. I’ve spent quite a few evenings decompiling the DER file into an ASN file without a whole lot of success (there are 14(!) layers of structures to contend with) and I’ve still not got an ASN file that can correctly parse my DER file for my simple unsigned v1 (<em>ohh yes</em>, v1 = SHA1, v2 = SHA256) test files. There is also a lot of junk data in the blob, and some questionable design choices which mean it’s a huge pain to read. Even if I manage to write the code to read the <code>.cat</code> data blob I’ve then got to populate the data (including the junk data…) so that Windows will accept my file to avoid needing a Microsoft box to generate all firmware images. Also add to the mix that the ASN.1 data is different on different Windows versions (with legacy versions overridden), which explains why you see things like <code>1.3.6.1.4.1.311.12.2.2</code> rather than translated titles in the catalog viewer in Windows XP when trying to view <code>.cat</code> files created on Windows 7.</p>\n<p>I’ve come to the conclusion that writing a library to reliably read and write all versions of <code>.cat</code> files is probably about 3 months work, and that’s 3 months I simply don’t have. Given there isn’t actually a specification (apart from a <a href="https://msdn.microsoft.com/en-us/library/aa380252(v=VS.85).aspx#catalog_definition_functions">super small guide</a> on how to use the MS crypto API) it would also be an uphill battle with every Windows release.</p>\n<p>We could of course do something Linux specific that does the same thing, although that obviously would not work on Windows and means we have to ask the vendors to do an extra step in release engineering. Using GPG would be easiest, but a lot of the hardware vendors seem wed to the PKCS certificate mechanism, and I suppose it does mean you can layer certificates for root trust, vendors and contractors. GPG signing the firmware file only doesn’t actually give us a file-list with the digest values of the other metadata in the .cab file.</p>\n<p>A naive solution would be to do something like this:</p>\n<pre>sha25sum firmware.inf firmware.metainfo.xml firmware.bin &gt; firmware.digest\nopenssl dgst -sha256 -sign cert-private.pem -out firmware.sign firmware.digest\nopenssl dgst -sha256 -verify cert-pubkey.pem -signature firmware.sign firmware.files\n</pre>\n<p>But to actually <em>extract</em> the firmware.digest file we need the <strong>private key</strong>. We can check prepared data using the public key, but that means shipping firmware.digest <em>and</em> firmware.sign when we only really want one file (.cab files checksum the files internally, so we can be sure against data corruption).</p>\n<p>Before I go crazy and invent yet another file format specification does anybody know of a signed digest format with an open specification? Better ideas certainly welcome, thanks.</p>\n<p>Richard.</p></div>\n </div>', 'title': 'Building a better catalog file', 'date': <GDateTime at 0x5606cd3fccc0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/hughsie/2015/07/14/building-a-better-catalog-file/', 'is_read': False, 'author_email': None}, {'fullname': 'karen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m back from Brazil where I attended FISL. I had the honor of presenting three talks! And they were three of my favorite topics: <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507081907.ogv"> the importance of compliance and the suit against VMware</a>, <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507101600.ogv">bringing more women to free and open source software</a> and <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507111100.ogv">why I care so much about software freedom in the first place</a>. It was a very fun conference. Besides doing the talks I was able to do a few press interviews too. And of course I loved meeting Brazilian hackers and software freedom activists. </p>\n<p>Attendees seemed very interested in enforcement and the <a href="http://sfconservancy.org/linux-compliance/">VMware suit</a>. I was happy to see support for this work, and there was discussion about local copyright holders signing up to the coalition. It really seems that folks are starting to see the downsides of noncopylefted projects and are frustrated by the pervasiveness of GPL violations. </p>\n<p>One of my favorite moments of the conference was the response to my talk about gender diversity. I admit that it’s disappointing that this talk is always attended disporportionately by women. As I sometimes say in the talk itself, it doesn’t make a lot of sense for the burden of this work to fall only on women. There are so few women right now in free software (1-11% at most) that it would be impossible for us to do it on any meaningful scale alone. Plus it’s not fair to expect women to undertake this work on top of their other contributions to free software (many women understandably don’t want to think about gender issues at all). Men can make a tremendous impact on this area. Most of our Outreachy mentors are men, and as the dominant group in free and open surce software, it’s men who can fundamentally change the culture to be more welcoming to women and other underrepresented groups. Nonetheless, it was amazing that the “mob” after my talk was mostly women. It was great to meet so many women who are leaders in Latin America and to hear about their extraordinary work. I was interviewed after the talk and was askd to give some<a href="https://www.youtube.com/watch?v=wy5Xkhywh84"> tips for women getting started in free software.</a></p>\n<p>The conference had a very different feel to it than a lot of the other conferences I attend. It was a community run conference (along with that awesome community feeling, a lot of students, etc.) but it’s such a big conference that it has some things that community conferences often don’t have. Like GNU and Tux mascots (thanks to Deb Nicholson for the photo)!</p>\n<p><a href="https://blogs.gnome.org/gnomg/files/2015/07/karengnutux.jpg"><img alt="karengnutux" class="alignnone size-full wp-image-793" src="https://blogs.gnome.org/gnomg/files/2015/07/karengnutux.jpg" width="550"/></a></p>\n<p>I loved seeing schoolkids excited to be there and quite a number of really little kids with GNU and Freedo shirts and toys.</p>\n<p>There was also a lot of love for GNOME, and it was great to meet up with people I don’t get to see very often, especially since I’m missing <a href="https://2015.guadec.org/">GUADEC this year. Plus we got to </a><a href="https://www.youtube.com/watch?v=zUyUWodqPm8&amp;feature=youtu.be">settle some outstanding Linux kernel/systemd issues</a>.</p>\n<p>FISL is an excellect conference – a wonderful alternative to the corporate trade association conference ciruit. I hope to be able to return some time in the future. Now to get ready for OSCON next week…</p></div>\n </div>', 'title': 'FISL16', 'date': <GDateTime at 0x5606cd3f5c20>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/gnomg/2015/07/14/fisl16/', 'is_read': False, 'author_email': None}, {'fullname': 'Jesse van den Kieboom', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m using the thunderbird conversations add-on and am generally quite happy with it. One pain point however is that its quick reply feature has a really small text area for replying. This is especially annoying if you want to reply in-line and have to scroll to relevant parts of the e-mail.</p>\n<p>A quick fix for this:</p>\n<ol>\n<li>Install the Stylish thunderbird add-on</li>\n<li>Add the following style snippet:\n<pre>.quickReply .textarea.selected {\n height: 400px !important;\n}</pre>\n</li>\n</ol>\n<p>Adjust height as preferred.</p></div>\n </div>', 'title': 'Making thunderbird conversations quick reply area larger', 'date': <GDateTime at 0x5606cd3fa4a0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/jessevdk/2015/07/15/making-thunderbird-conversations-quick-reply-area-larger/', 'is_read': False, 'author_email': None}, {'fullname': 'felipeborges', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p/>\n<p>A nice feature Apple has is the ability of accessing a window-specific dialog right from their title bar.</p>\n<p><a href="https://pbs.twimg.com/media/CH0hIGRWIAAe2LC.png:large"><img alt="" class="aligncenter" height="230" src="https://pbs.twimg.com/media/CH0hIGRWIAAe2LC.png:large" width="582"/></a></p>\n<p>\xa0</p>\n<p>I think that would be pretty useful in Documents’ context as well. So I’ve written this <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751189" target="_blank">small patch</a>.</p>\n<p>I’ve been pointed out that it duplicates the access to the Properties dialog. We already have that on the hamburger menu. But still, I think that would be cool. <strong>What do you think?</strong></p></div>\n </div>', 'title': 'Documents idea: rename documents right from the title bar', 'date': <GDateTime at 0x5606cd403600>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/felipeborges/proposal-proprierties-title-bar/', 'is_read': False, 'author_email': None}, {'fullname': 'felipeborges', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The GNOME Project has released GNOME 3.12 today.\xa0Congratulations to all the approximately 1140 contributors\xa0that made 34236\xa0really awesome changes in this release.</p>\n<p>Bastian Hougaard and Karen Sandler (GNOME Executive Director) have made an<em> Introducing GNOME 3.12</em> video, check it out!</p>\n<p>Don’t forget to check the <a href="https://help.gnome.org/misc/release-notes/3.12/" target="_blank" title="GNOME 3.12 Release notes">release notes</a>. If you’re a hardcore Fedora user, you can get GNOME 3.12 using <a href="https://copr.fedoraproject.org/coprs/rhughes/f20-gnome-3-12/" target="_blank" title="rhughes / f20-gnome-3-12">Richard Hughes’ rpm\xa0repository</a>.</p></div>\n </div>', 'title': 'GNOME 3.12 Released!', 'date': <GDateTime at 0x5606cd406320>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/felipeborges/gnome-3-12-released/', 'is_read': False, 'author_email': None}, {'fullname': 'Adrien Plazas', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Lasse and I spent some time recently to produce a Beamer template for GUADEC 2015. You can find it here: <a href="https://github.com/sils1297/guadec-presentation-templates">github.com/sils1297/guadec-presentation-templates</a>.</p> <div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-6PW1Sb5MY1E/VaZ-dFjlg8I/AAAAAAAAAIo/aU3mEN-XNoE/s1600/guadec-2015-beamer-title.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-6PW1Sb5MY1E/VaZ-dFjlg8I/AAAAAAAAAIo/aU3mEN-XNoE/s480/guadec-2015-beamer-title.png"/></a></div> <p>You can use it with Pandoc or directly with LaTeX. Example are shipped too:</p><ul> <li><b>2015/presentation.md</b> is a Pandoc example, build it with <b>make pandoc</b> to produce <b>2015/presentation.pdf</b>;</li> <li>2015/guadec-example.tex is a LaTeX example, build it with <b>make tex</b> to produce <b>2015/guadec-example.pdf</b>.</li></ul> <div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-aRFsmgeMhlc/VaZ-deyNkVI/AAAAAAAAAIs/ZBjM9z9sSBo/s1600/guadec-2015-beamer-slide.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-aRFsmgeMhlc/VaZ-deyNkVI/AAAAAAAAAIs/ZBjM9z9sSBo/s480/guadec-2015-beamer-slide.png"/></a></div> <p>I hope you\'ll enjoy it, feedback is welcome and if you have any problem don\'t hesitate to contact me (Kekun) or Lasse (sils) GIMPNet <a href="irc://irc.gimp.org/#guadec">#guadec on GIMPNet</a>.</p></div>\n </div>', 'title': 'GUADEC 2015 get its Beamer template!', 'date': <GDateTime at 0x5606cd3f0c00>, 'author_homepage': 'https://plus.google.com/112791072160767246710', 'url': 'http://bytesgnomeschozo.blogspot.com/2015/07/guadec-2015-get-its-beamer-template.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}]
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('Jakub Brindza'), returned Jakub Brindza
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16cb048 (uninitialized at 0x0)>, {'fullname': 'Jakub Brindza', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It seemed to take forever. Endless PR reviews, improvements, code refactoring and hours spent working on editor, removing deprecated icons or search.<br/><br/>However, at the beginning of this week I finally managed to get the pull requests to a state when they could be merged. As a consequence, Getting Things GNOME! now features (well, from 99% I dare to say) most up-to-date widgets and properties. Moreover, master version is now boosted with re-designed editor window as you can see from the photo here:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-P4VIu-UTPX0/VZ_SYuDT8wI/AAAAAAAAEH8/ti8zCCQIXWM/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B16.09.21.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://3.bp.blogspot.com/-P4VIu-UTPX0/VZ_SYuDT8wI/AAAAAAAAEH8/ti8zCCQIXWM/s400/Screen%2BShot%2B2015-07-10%2Bat%2B16.09.21.png" width="400"/></a></div><div class="separator" style="clear: both; text-align: center;"><br/></div><div class="separator" style="clear: both; text-align: left;">As for another challenge I decided to face in my summer experience, I chose to refurbish preferences.</div><div class="separator" style="clear: both; text-align: left;">All in all, the beginnings were not that tough. Currently, my version features re-newed implementation of the general settings.</div><div class="separator" style="clear: both; text-align: left;">In the (very soon) future, I\'ll moreover be implementing also the plugins and synchronisation services in the same preferences window. This way, users will be experiencing a much simpler to use and friendlier environment when it comes to customisation of the app.</div><div class="separator" style="clear: both; text-align: left;"><br/></div><div class="separator" style="clear: both; text-align: left;">Without some exhausting descriptions, take a look at the current additions to the Getting Things GNOME!</div><div class="separator" style="clear: both; text-align: left;"><br/></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-CoU4QWjHmLg/VZ_Tpu8rpSI/AAAAAAAAEIU/DhgjcoG2u1k/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.58.55.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="http://3.bp.blogspot.com/-CoU4QWjHmLg/VZ_Tpu8rpSI/AAAAAAAAEIU/DhgjcoG2u1k/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.58.55.png" width="400"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Preferences window now features side menu for three major categories and main window to view particular settings</td></tr></tbody></table><br/><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-LIXHRLPYK3Q/VZ_TpCtKfaI/AAAAAAAAEIM/twl3lFVCIYQ/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.02.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="http://4.bp.blogspot.com/-LIXHRLPYK3Q/VZ_TpCtKfaI/AAAAAAAAEIM/twl3lFVCIYQ/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.02.png" width="400"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Plugins and Synchronisation services. Coming soon!</td></tr></tbody></table><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-sf2kZIa1C2I/VZ_TnxplIUI/AAAAAAAAEII/De2Z-mwa-mQ/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.05.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://4.bp.blogspot.com/-sf2kZIa1C2I/VZ_TnxplIUI/AAAAAAAAEII/De2Z-mwa-mQ/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.05.png" width="400"/></a></div><div class="separator" style="clear: both; text-align: left;"><br/></div><br/>In Plugins window, the plan is to re-make entirely the current way of viewing individual plugins. I will be trying to get rid of the treeview and place each plugin in a separate GtkBox. I\'m particularly looking forward to this. The reason is that I have not yet tried to create one general widget that would be applied to all the elements, but rather created all the individual elements. This was both inefficient and exhausting, so I\'d love to learn how to apply the same pattern to several places.<br/><br/>As for the synchronisation services, I\'m sure you\'ll notice some refurbishments here, too, in a short period of time.<br/><br/>The overall aim is to produce a simple, sleek and easy-to-use interface that will be 100% functional and bring Getting Things GNOME again a bit closer to GNOME 3 standards.<br/><br/>I love the changes and so I hope you do as well.<br/><br/>On the other hand, for the past few hours I\'ve been trying to make parents viewing feature in Task Editor functional, since this was one of the features which lacked in <a href="http://www.jakubbrindza.com/2015/06/another-huge-leap-for-gtg.html" target="_blank">my last PR</a>, even though the UI is present. Not many break-throughs in there so far though.<br/>Getting Things GNOME features a function get_parents() whose name I found rather misleading since I found out that it does not give you a list of all parents a task may have (assuming it\'s a task of level 2+), but it gives you only the most direct, one-level-up parent. This makes the entire problem a bit more difficult since I cannot easily, let\'s say, make an array that would hold all the names (or task id\'s) of a task\'s parents which would then be placed into a popover.<br/>This may be tough, but it\'s a core feature which needs to be implemented, so I want to work on it.<br/><br/>Stay tuned!</div>\n </div>', 'title': 'GTG Preferences -- REMADE!', 'date': <GDateTime at 0x5606cd3fa180>, 'author_homepage': 'http://www.blogger.com/profile/12785763043249070999', 'url': 'http://www.jakubbrindza.com/2015/07/gtg-preferences-remade.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'Jakub Brindza', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It seemed to take forever. Endless PR reviews, improvements, code refactoring and hours spent working on editor, removing deprecated icons or search.<br/><br/>However, at the beginning of this week I finally managed to get the pull requests to a state when they could be merged. As a consequence, Getting Things GNOME! now features (well, from 99% I dare to say) most up-to-date widgets and properties. Moreover, master version is now boosted with re-designed editor window as you can see from the photo here:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-P4VIu-UTPX0/VZ_SYuDT8wI/AAAAAAAAEH8/ti8zCCQIXWM/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B16.09.21.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://3.bp.blogspot.com/-P4VIu-UTPX0/VZ_SYuDT8wI/AAAAAAAAEH8/ti8zCCQIXWM/s400/Screen%2BShot%2B2015-07-10%2Bat%2B16.09.21.png" width="400"/></a></div><div class="separator" style="clear: both; text-align: center;"><br/></div><div class="separator" style="clear: both; text-align: left;">As for another challenge I decided to face in my summer experience, I chose to refurbish preferences.</div><div class="separator" style="clear: both; text-align: left;">All in all, the beginnings were not that tough. Currently, my version features re-newed implementation of the general settings.</div><div class="separator" style="clear: both; text-align: left;">In the (very soon) future, I\'ll moreover be implementing also the plugins and synchronisation services in the same preferences window. This way, users will be experiencing a much simpler to use and friendlier environment when it comes to customisation of the app.</div><div class="separator" style="clear: both; text-align: left;"><br/></div><div class="separator" style="clear: both; text-align: left;">Without some exhausting descriptions, take a look at the current additions to the Getting Things GNOME!</div><div class="separator" style="clear: both; text-align: left;"><br/></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-CoU4QWjHmLg/VZ_Tpu8rpSI/AAAAAAAAEIU/DhgjcoG2u1k/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.58.55.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="http://3.bp.blogspot.com/-CoU4QWjHmLg/VZ_Tpu8rpSI/AAAAAAAAEIU/DhgjcoG2u1k/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.58.55.png" width="400"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Preferences window now features side menu for three major categories and main window to view particular settings</td></tr></tbody></table><br/><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-LIXHRLPYK3Q/VZ_TpCtKfaI/AAAAAAAAEIM/twl3lFVCIYQ/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.02.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="http://4.bp.blogspot.com/-LIXHRLPYK3Q/VZ_TpCtKfaI/AAAAAAAAEIM/twl3lFVCIYQ/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.02.png" width="400"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Plugins and Synchronisation services. Coming soon!</td></tr></tbody></table><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-sf2kZIa1C2I/VZ_TnxplIUI/AAAAAAAAEII/De2Z-mwa-mQ/s1600/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.05.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://4.bp.blogspot.com/-sf2kZIa1C2I/VZ_TnxplIUI/AAAAAAAAEII/De2Z-mwa-mQ/s400/Screen%2BShot%2B2015-07-10%2Bat%2B10.59.05.png" width="400"/></a></div><div class="separator" style="clear: both; text-align: left;"><br/></div><br/>In Plugins window, the plan is to re-make entirely the current way of viewing individual plugins. I will be trying to get rid of the treeview and place each plugin in a separate GtkBox. I\'m particularly looking forward to this. The reason is that I have not yet tried to create one general widget that would be applied to all the elements, but rather created all the individual elements. This was both inefficient and exhausting, so I\'d love to learn how to apply the same pattern to several places.<br/><br/>As for the synchronisation services, I\'m sure you\'ll notice some refurbishments here, too, in a short period of time.<br/><br/>The overall aim is to produce a simple, sleek and easy-to-use interface that will be 100% functional and bring Getting Things GNOME again a bit closer to GNOME 3 standards.<br/><br/>I love the changes and so I hope you do as well.<br/><br/>On the other hand, for the past few hours I\'ve been trying to make parents viewing feature in Task Editor functional, since this was one of the features which lacked in <a href="http://www.jakubbrindza.com/2015/06/another-huge-leap-for-gtg.html" target="_blank">my last PR</a>, even though the UI is present. Not many break-throughs in there so far though.<br/>Getting Things GNOME features a function get_parents() whose name I found rather misleading since I found out that it does not give you a list of all parents a task may have (assuming it\'s a task of level 2+), but it gives you only the most direct, one-level-up parent. This makes the entire problem a bit more difficult since I cannot easily, let\'s say, make an array that would hold all the names (or task id\'s) of a task\'s parents which would then be placed into a popover.<br/>This may be tough, but it\'s a core feature which needs to be implemented, so I want to work on it.<br/><br/>Stay tuned!</div>\n </div>', 'title': 'GTG Preferences -- REMADE!', 'date': <GDateTime at 0x5606cd3fa180>, 'author_homepage': 'http://www.blogger.com/profile/12785763043249070999', 'url': 'http://www.jakubbrindza.com/2015/07/gtg-preferences-remade.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}, <FlowBox object at 0x7f7fa16bdf78 (GtkFlowBox at 0x5606cd70ecd0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('Allan'), returned Allan
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16cb1b0 (uninitialized at 0x0)>, {'fullname': 'Allan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>So <a href="https://mail.gnome.org/archives/foundation-announce/2015-June/msg00003.html">this</a> happened. It’s the first time I’ve served on the Foundation’s Board of Directors, and I thought it would be good to write about the experience.</p>\n<p>The GNOME Foundation Board can often be a bit opaque. Generally it works in the background, and while you can get a sense of some of its activities through <a href="https://wiki.gnome.org/FoundationBoard/Minutes">the minutes</a>, it is easy to forget that the board is out there doing its thing. </p>\n<p>It has been a bit of a revelation to see just how active the board is. It’s a bit like I’ve discovered a new, secret world inside the GNOME project. And there’s a lot happening in this world – it is always busy.</p>\n<p>There’s an IRC channel and several private mailing lists, which are very active. And there are tasks being taken care of all the time – I already have a list of three or four things that I’m sorting out, for example.</p>\n<p>I was impressed by the first board meeting I participated in. There was a clear agenda that was followed, minutes were recorded as the meeting went on, and the meeting ran to time. Many of the agenda items weren’t particularly glamorous, but they were things that need to be done, and there was a good level of scrutiny around each one.</p>\n<p>There have been a few other things that have surprised me about the board. I wasn’t fully aware of how institutionalised it is. We are governed by our <a href="https://www.gnome.org/wp-content/uploads/2012/02/bylaws.pdf">bylaws</a>, which set out how the board has to operate, as well as some of its obligations. I read them recently, and was surprised by a couple of things that are in there. If you’re a Foundation member, you might be interested to take a look.</p>\n<p>Another thing is just how important Rosanna is to the board. For those who don’t know, Rosanna is the Foundation’s Director of Operations. Not only does she take care of a lot of the Foundation’s adminstration, but she is a valuable source of knowledge and expertise, having worked for the Foundation for numerous years. She’s another one of those aspects of the Foundation that is both important and, often, hidden from view.</p>\n<p>I’m still busy learning the ropes, and there’s a lot I have to learn. So far it is satisfying work though, and good to see another side of the GNOME project.</p></div>\n </div>', 'title': 'Diary of a new board member', 'date': <GDateTime at 0x5606cd3f6100>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/aday/2015/07/13/diary-of-a-new-board-member/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'Allan', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>So <a href="https://mail.gnome.org/archives/foundation-announce/2015-June/msg00003.html">this</a> happened. It’s the first time I’ve served on the Foundation’s Board of Directors, and I thought it would be good to write about the experience.</p>\n<p>The GNOME Foundation Board can often be a bit opaque. Generally it works in the background, and while you can get a sense of some of its activities through <a href="https://wiki.gnome.org/FoundationBoard/Minutes">the minutes</a>, it is easy to forget that the board is out there doing its thing. </p>\n<p>It has been a bit of a revelation to see just how active the board is. It’s a bit like I’ve discovered a new, secret world inside the GNOME project. And there’s a lot happening in this world – it is always busy.</p>\n<p>There’s an IRC channel and several private mailing lists, which are very active. And there are tasks being taken care of all the time – I already have a list of three or four things that I’m sorting out, for example.</p>\n<p>I was impressed by the first board meeting I participated in. There was a clear agenda that was followed, minutes were recorded as the meeting went on, and the meeting ran to time. Many of the agenda items weren’t particularly glamorous, but they were things that need to be done, and there was a good level of scrutiny around each one.</p>\n<p>There have been a few other things that have surprised me about the board. I wasn’t fully aware of how institutionalised it is. We are governed by our <a href="https://www.gnome.org/wp-content/uploads/2012/02/bylaws.pdf">bylaws</a>, which set out how the board has to operate, as well as some of its obligations. I read them recently, and was surprised by a couple of things that are in there. If you’re a Foundation member, you might be interested to take a look.</p>\n<p>Another thing is just how important Rosanna is to the board. For those who don’t know, Rosanna is the Foundation’s Director of Operations. Not only does she take care of a lot of the Foundation’s adminstration, but she is a valuable source of knowledge and expertise, having worked for the Foundation for numerous years. She’s another one of those aspects of the Foundation that is both important and, often, hidden from view.</p>\n<p>I’m still busy learning the ropes, and there’s a lot I have to learn. So far it is satisfying work though, and good to see another side of the GNOME project.</p></div>\n </div>', 'title': 'Diary of a new board member', 'date': <GDateTime at 0x5606cd3f6100>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/aday/2015/07/13/diary-of-a-new-board-member/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdf78 (GtkFlowBox at 0x5606cd70ecd0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('shaunm'), returned shaunm
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16cb1f8 (uninitialized at 0x0)>, {'fullname': 'shaunm', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The <a href="https://conf.openhelp.cc/">Open Help Conference &amp; Sprints</a> is happening again this year. Open Help is the only event focused on open source documentation and support. It features a two-day conference with a mix of presentations, demos, and open discussions. This format has proven very popular, and really helps people find real solutions to improve their documentation. The conference this year is September 26-27. (But don’t miss the amazing reception September 25!)</p>\n<p>After the conference, Open Help hosts three days of multiple-team sprints. The sprints are September 28-30 this year. Open Help has hosted doc sprints for teams like GNOME, Mozilla, FreeBSD, Wikipedia, WordPress, OpenMRS, and WebPlatform.org. In many cases, Open Help was a team’s first exposure to having a sprint.</p>\n<p>I wrote an <a href="http://opensource.com/community/15/7/five-lessons-open-help-doc-sprints">article on opensource.com</a> about the Open Help doc sprints, along with five tips on holding a successful sprint.</p>\n<p>Documentation is important. This is the fifth year that Open Help will be helping open source teams create better documentation. <strong>But we need your help.</strong> Please spread the word about Open Help to any communities you’re involved with. Send mail to mailing lists. Tweet. Tell your friends. Get the word out however you can.</p>\n<p>Open Help is only great because of the people who come.</p></div>\n </div>', 'title': 'Come to Open Help. Have a Doc Sprint.', 'date': <GDateTime at 0x5606cd3fdcc0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/shaunm/2015/07/13/come-to-open-help-have-a-doc-sprint/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'shaunm', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The <a href="https://conf.openhelp.cc/">Open Help Conference &amp; Sprints</a> is happening again this year. Open Help is the only event focused on open source documentation and support. It features a two-day conference with a mix of presentations, demos, and open discussions. This format has proven very popular, and really helps people find real solutions to improve their documentation. The conference this year is September 26-27. (But don’t miss the amazing reception September 25!)</p>\n<p>After the conference, Open Help hosts three days of multiple-team sprints. The sprints are September 28-30 this year. Open Help has hosted doc sprints for teams like GNOME, Mozilla, FreeBSD, Wikipedia, WordPress, OpenMRS, and WebPlatform.org. In many cases, Open Help was a team’s first exposure to having a sprint.</p>\n<p>I wrote an <a href="http://opensource.com/community/15/7/five-lessons-open-help-doc-sprints">article on opensource.com</a> about the Open Help doc sprints, along with five tips on holding a successful sprint.</p>\n<p>Documentation is important. This is the fifth year that Open Help will be helping open source teams create better documentation. <strong>But we need your help.</strong> Please spread the word about Open Help to any communities you’re involved with. Send mail to mailing lists. Tweet. Tell your friends. Get the word out however you can.</p>\n<p>Open Help is only great because of the people who come.</p></div>\n </div>', 'title': 'Come to Open Help. Have a Doc Sprint.', 'date': <GDateTime at 0x5606cd3fdcc0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/shaunm/2015/07/13/come-to-open-help-have-a-doc-sprint/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdf78 (GtkFlowBox at 0x5606cd70ecd0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('murrayc'), returned murrayc
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16cb240 (uninitialized at 0x0)>, {'fullname': 'murrayc', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>My <a href="https://github.com/murraycu/android-galaxyzoo/">Galaxy Zoo app for android</a> has been on the Play store for several months now and seems to be generally well liked. So far it has around 800 users, increasing slowly and linearly, probably because it isn’t linked from the galaxyzoo.org website. But even the first hundred users were enough to show me several problems that I needed to fix. I’ve written about them here, with links to the commits that fixed them in my app, because other app developers will experience them too.</p>\n<p>These were general Android development problems, not specific to android-galaxyzoo. I guess that this is the difference between someone who understands how the Android API should be used, and someone who has actually used it with real users. It shouldn’t be quite this difficult.</p>\n<h3>Work in the main thread (Strict Mode)</h3>\n<p>Your code should not perform long-running tasks, such as network or disk IO, in the main thread, because UIs should not be unresponsive. By enabling Strict Mode in your code, you can make this cause exceptions, turning a non-responsive app into a crashing app. It would be unwise to turn this on in your app’s release version.</p>\n<p>However, some “power” users seem to have this on via the developer options. They probably experience instability in many apps. And Android 3.0 (Honeycomb) has some Strict Mode settings on <a href="http://developer.android.com/reference/android/os/StrictMode.ThreadPolicy.Builder.html#penaltyDeathOnNetwork%28%29">by default</a>. So you will get crash reports via the Google Play store if you ignore Strict Mode exceptions.</p>\n<p>As I mentioned in my <a href="http://www.murrayc.com/permalink/tag/android/">previous entry</a>, AccountManager is <a href="http://developer.android.com/reference/android/accounts/AccountManager.html#getAccountsByType%28java.lang.String%29">documented as being safe for use on the Main UI Thread</a>, but it’s not, so I needed to <a href="https://github.com/murraycu/android-galaxyzoo/commit/426918f8c43e5aab0c9946c6fa7e8eebe2f5b531">use the AccountManager via AsyncTask</a>.</p>\n<p>If you are using a ContentProvider, you should not try to store data in the ContentProvider in the main thread. I instead <a href="https://github.com/murraycu/android-galaxyzoo/commit/6a18ce07c4ad136eed94c6d8a9d8eaec96bb303e">did that via AsyncTask.</a></p>\n<p>Likewise, <a href="https://github.com/murraycu/android-galaxyzoo/commit/fdef5fdba83d6ef4dd767e728a08378e294bc631">avoid calling BitmapFactory.decodeStream() in the main thread</a>, though it’s easier to <a href="https://github.com/murraycu/android-galaxyzoo/commit/009ddd077968f1a2feac4de196ec814a74017c62">just use Picasso</a> anyway.</p>\n<h3>Automatic cache deletion</h3>\n<p>Your app probably caches some data, such as images, in its cache directory, such as the <a href="http://developer.android.com/reference/android/content/Context.html#getExternalCacheDir%28%29">getExternalCacheDir()</a> directory (/storage/sdcard/Android/data/com.you.yourapp/cache). However, Android will delete those files whenever it needs the space, and it won’t explicitly tell your app that it’s happened. So you need to check that your cached files really exist, one by one. You can either check the files when you first try to use them (causing UI delay) or you can check in the background, maybe trying to re-download the files.</p>\n<p>This confused my code completely and it was hard to identify the cause of the resulting <a href="https://github.com/murraycu/android-galaxyzoo/issues/12">bug</a> because the cache deletion by the system was not triggered by any particular action in my app.</p>\n<p>By the way, although the <a href="http://developer.android.com/reference/android/content/Context.html#getExternalCacheDir%28%29">getExternalCacheDir() documentation</a> says that you don’t need to request permission to use that (app’s own) directory since Android 4.4 (KitKat), that’s not true – you do <a href="http://stackoverflow.com/questions/27016647/why-do-i-need-the-write-external-storage-permission-with-getexternalcachedir-o">need to request the permission on Android 5.0 (Lollipop)</a>.</p>\n<h3>IllegalStateException: Can not perform this action after onSaveInstanceState</h3>\n<p>There are things that you cannot do in between an activity’s state being saved and that activity being resumed. It’s hard to know when that is the case but if you get it wrong then your app will crash. Here’s a <a href="http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html">full explanatio</a>n, though you’ll wish you didn’t have to bother with it.</p>\n<p>For instance, you should delay any use of AlertDialog until the parent activity’s onResumeFragments, which I did <a href="https://github.com/murraycu/android-galaxyzoo/commit/012b88c13d9f082fc99d0dee9e5b196f94ff5d60">like so</a>.</p>\n<p>Likewise, you should not commit fragment transactions until after your activity has resumed. Again, its best to <a href="https://github.com/murraycu/android-galaxyzoo/commit/ee65f7b704a7a425cd1d0d6380c1433ab9482d02">cause the commit of the fragment transaction in the parent activity’s onResumeFragments() </a>because there’s nowhere suitable to do that in the fragment. The code could be much simpler if there was just somewhere safe in the Fragment to do this.</p>\n<p>I believe that this problem hits every Android app developer who ever had more than a handful of users. It feels like a failure in the Android API design and the fixes feel like workarounds. If there was any clear way to structure app code to avoid this from the start then that would be mentioned early in the developer documentation.</p>\n<h3>Mutiple onLoadFinished() calls</h3>\n<p>If you use a ContentProvider (as I think you <a href="http://www.murrayc.com/permalink/2014/06/17/android-glom-experiments/">should</a>) then you’ll use a Cursor Loader to get its data, overriding onCreateLoader() and onLoadFinished() and calling getLoaderManaged().restartLoader().</p>\n<p>However, you will notice that your onLoadFinished() is often called more than once, sometimes with older data, confusing your app. This can be avoided by calling getLoaderManager.destroyLoader() in your onLoadFinished. For <a href="https://github.com/murraycu/android-galaxyzoo/commit/3438f8a2f639699e6f026f4daa8531190d547f55">instance</a>. I’m fairly sure this is an Android bug – at the least it is a poorly documented and unforgiving aspect of the API.</p>\n<h3>ConcurrentModificationException</h3>\n<p>I had at least one <a href="https://github.com/murraycu/android-galaxyzoo/issues/15">crash report with a ConcurrentModificationException</a>, suggesting that two threads were changing the same data at the same time though I thought I had designed my code to avoid that and I thought I had made the class mostly immutable. So to avoid any chance of sharing data between threads <a href="https://github.com/murraycu/android-galaxyzoo/commit/b938717baa74c96e22e30686860564b5270ec37f">I did some defensive copying </a>(and <a href="https://github.com/murraycu/android-galaxyzoo/commit/60bcad361d4d75c8f294d47ba05fbfead942567d">here</a>). I haven’t seen the crash since.</p>\n<h3>Toolbar’s Up button doesn’t act like the Back button</h3>\n<p>Android has a standard Back button that most users understand. It generally takes the user to the previous screen (activity), and that previous screen will look like it last looked for them.\xa0 But Android also has the concept of an Up button which few users understand.</p>\n<p>The Up button is usually at the left of the app’s top toolbar (appbar) and it usually looks like a Back button. But it’s not a Back button. It takes the user to the parent level of the app instead of stepping back through all the previous screens that the user has traveled through since they were last at the top-level. Of course, most users don’t have any concept of the app having a hierarchy of screens in addition to a history of sibling screens. I predict that the Up button idea will be removed from Android one day.</p>\n<p>At a second-level activity (something opened from the top-level), a user can justifiably expect the Back button and Up button to have the same effect – take me to the previous (top-level) screen/activity – even if the user knows about the Back/Up difference. However, by default the Up button will start a new parent activity instead of going back to the previous instance of that activity (as Back would). Users experience this as a loss of data – for instance this <a href="https://github.com/murraycu/android-galaxyzoo/issues/6#issuecomment-64186721">bug</a> and this <a href="https://github.com/murraycu/android-galaxyzoo/issues/14">bug</a>.</p>\n<p>The fix for this depends on the situation:</p>\n<ul>\n<li>In your Up button handler, you can resume your parent activity by <a href="https://github.com/murraycu/android-galaxyzoo/commit/a910d80663ce38ab125223ee9e51512e4ebbe888">passing FLAG_ACTIVITY_CLEAR on an intent that you pass to N<span class="blob-code-inner"><span class="pl-smi">avUtils</span><span class="pl-k">.</span>navigateUpTo</span>()</a>, instead of recreating the activity by just calling <span class="blob-code-inner"><span class="pl-c">NavUtils.navigateUpFromSameTask</span></span>().</li>\n<li>If you know that your top-level parent activity should never have more than one instance, because it can only ever show the one true set of data, you can prevent multiple instances of the activity from being instantiated, by setting <a href="https://github.com/murraycu/android-galaxyzoo/commit/da1347454e0c0f2d7e6c9dd220931e1bd8baeb53">launchMode=singleTop in your AndroidManifest.xm</a>l.</li>\n</ul>\n<h3>Duplicated child fragments</h3>\n<p>My app uses child fragments (fragments in a fragment), which Android needs us to add in code rather than in the layout XML file. Strangely, I sometimes saw duplicate fragments thought it was hard to reproduce it reliably. The answer was to\xa0<a href="https://github.com/murraycu/android-galaxyzoo/commit/7dd2af782464760c6541f694e1ba123180784459"> always use FragmentTransaction.replace() instead of add()</a>.</p>\n<p>\xa0</p></div>\n </div>', 'title': 'android-galaxyzoo: Fixing typical Android bugs', 'date': <GDateTime at 0x5606cd413b60>, 'author_homepage': None, 'url': 'http://www.murrayc.com/permalink/2015/07/14/android-galaxyzoo-fixing-typical-android-bugs/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'murrayc', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>My <a href="https://github.com/murraycu/android-galaxyzoo/">Galaxy Zoo app for android</a> has been on the Play store for several months now and seems to be generally well liked. So far it has around 800 users, increasing slowly and linearly, probably because it isn’t linked from the galaxyzoo.org website. But even the first hundred users were enough to show me several problems that I needed to fix. I’ve written about them here, with links to the commits that fixed them in my app, because other app developers will experience them too.</p>\n<p>These were general Android development problems, not specific to android-galaxyzoo. I guess that this is the difference between someone who understands how the Android API should be used, and someone who has actually used it with real users. It shouldn’t be quite this difficult.</p>\n<h3>Work in the main thread (Strict Mode)</h3>\n<p>Your code should not perform long-running tasks, such as network or disk IO, in the main thread, because UIs should not be unresponsive. By enabling Strict Mode in your code, you can make this cause exceptions, turning a non-responsive app into a crashing app. It would be unwise to turn this on in your app’s release version.</p>\n<p>However, some “power” users seem to have this on via the developer options. They probably experience instability in many apps. And Android 3.0 (Honeycomb) has some Strict Mode settings on <a href="http://developer.android.com/reference/android/os/StrictMode.ThreadPolicy.Builder.html#penaltyDeathOnNetwork%28%29">by default</a>. So you will get crash reports via the Google Play store if you ignore Strict Mode exceptions.</p>\n<p>As I mentioned in my <a href="http://www.murrayc.com/permalink/tag/android/">previous entry</a>, AccountManager is <a href="http://developer.android.com/reference/android/accounts/AccountManager.html#getAccountsByType%28java.lang.String%29">documented as being safe for use on the Main UI Thread</a>, but it’s not, so I needed to <a href="https://github.com/murraycu/android-galaxyzoo/commit/426918f8c43e5aab0c9946c6fa7e8eebe2f5b531">use the AccountManager via AsyncTask</a>.</p>\n<p>If you are using a ContentProvider, you should not try to store data in the ContentProvider in the main thread. I instead <a href="https://github.com/murraycu/android-galaxyzoo/commit/6a18ce07c4ad136eed94c6d8a9d8eaec96bb303e">did that via AsyncTask.</a></p>\n<p>Likewise, <a href="https://github.com/murraycu/android-galaxyzoo/commit/fdef5fdba83d6ef4dd767e728a08378e294bc631">avoid calling BitmapFactory.decodeStream() in the main thread</a>, though it’s easier to <a href="https://github.com/murraycu/android-galaxyzoo/commit/009ddd077968f1a2feac4de196ec814a74017c62">just use Picasso</a> anyway.</p>\n<h3>Automatic cache deletion</h3>\n<p>Your app probably caches some data, such as images, in its cache directory, such as the <a href="http://developer.android.com/reference/android/content/Context.html#getExternalCacheDir%28%29">getExternalCacheDir()</a> directory (/storage/sdcard/Android/data/com.you.yourapp/cache). However, Android will delete those files whenever it needs the space, and it won’t explicitly tell your app that it’s happened. So you need to check that your cached files really exist, one by one. You can either check the files when you first try to use them (causing UI delay) or you can check in the background, maybe trying to re-download the files.</p>\n<p>This confused my code completely and it was hard to identify the cause of the resulting <a href="https://github.com/murraycu/android-galaxyzoo/issues/12">bug</a> because the cache deletion by the system was not triggered by any particular action in my app.</p>\n<p>By the way, although the <a href="http://developer.android.com/reference/android/content/Context.html#getExternalCacheDir%28%29">getExternalCacheDir() documentation</a> says that you don’t need to request permission to use that (app’s own) directory since Android 4.4 (KitKat), that’s not true – you do <a href="http://stackoverflow.com/questions/27016647/why-do-i-need-the-write-external-storage-permission-with-getexternalcachedir-o">need to request the permission on Android 5.0 (Lollipop)</a>.</p>\n<h3>IllegalStateException: Can not perform this action after onSaveInstanceState</h3>\n<p>There are things that you cannot do in between an activity’s state being saved and that activity being resumed. It’s hard to know when that is the case but if you get it wrong then your app will crash. Here’s a <a href="http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html">full explanatio</a>n, though you’ll wish you didn’t have to bother with it.</p>\n<p>For instance, you should delay any use of AlertDialog until the parent activity’s onResumeFragments, which I did <a href="https://github.com/murraycu/android-galaxyzoo/commit/012b88c13d9f082fc99d0dee9e5b196f94ff5d60">like so</a>.</p>\n<p>Likewise, you should not commit fragment transactions until after your activity has resumed. Again, its best to <a href="https://github.com/murraycu/android-galaxyzoo/commit/ee65f7b704a7a425cd1d0d6380c1433ab9482d02">cause the commit of the fragment transaction in the parent activity’s onResumeFragments() </a>because there’s nowhere suitable to do that in the fragment. The code could be much simpler if there was just somewhere safe in the Fragment to do this.</p>\n<p>I believe that this problem hits every Android app developer who ever had more than a handful of users. It feels like a failure in the Android API design and the fixes feel like workarounds. If there was any clear way to structure app code to avoid this from the start then that would be mentioned early in the developer documentation.</p>\n<h3>Mutiple onLoadFinished() calls</h3>\n<p>If you use a ContentProvider (as I think you <a href="http://www.murrayc.com/permalink/2014/06/17/android-glom-experiments/">should</a>) then you’ll use a Cursor Loader to get its data, overriding onCreateLoader() and onLoadFinished() and calling getLoaderManaged().restartLoader().</p>\n<p>However, you will notice that your onLoadFinished() is often called more than once, sometimes with older data, confusing your app. This can be avoided by calling getLoaderManager.destroyLoader() in your onLoadFinished. For <a href="https://github.com/murraycu/android-galaxyzoo/commit/3438f8a2f639699e6f026f4daa8531190d547f55">instance</a>. I’m fairly sure this is an Android bug – at the least it is a poorly documented and unforgiving aspect of the API.</p>\n<h3>ConcurrentModificationException</h3>\n<p>I had at least one <a href="https://github.com/murraycu/android-galaxyzoo/issues/15">crash report with a ConcurrentModificationException</a>, suggesting that two threads were changing the same data at the same time though I thought I had designed my code to avoid that and I thought I had made the class mostly immutable. So to avoid any chance of sharing data between threads <a href="https://github.com/murraycu/android-galaxyzoo/commit/b938717baa74c96e22e30686860564b5270ec37f">I did some defensive copying </a>(and <a href="https://github.com/murraycu/android-galaxyzoo/commit/60bcad361d4d75c8f294d47ba05fbfead942567d">here</a>). I haven’t seen the crash since.</p>\n<h3>Toolbar’s Up button doesn’t act like the Back button</h3>\n<p>Android has a standard Back button that most users understand. It generally takes the user to the previous screen (activity), and that previous screen will look like it last looked for them.\xa0 But Android also has the concept of an Up button which few users understand.</p>\n<p>The Up button is usually at the left of the app’s top toolbar (appbar) and it usually looks like a Back button. But it’s not a Back button. It takes the user to the parent level of the app instead of stepping back through all the previous screens that the user has traveled through since they were last at the top-level. Of course, most users don’t have any concept of the app having a hierarchy of screens in addition to a history of sibling screens. I predict that the Up button idea will be removed from Android one day.</p>\n<p>At a second-level activity (something opened from the top-level), a user can justifiably expect the Back button and Up button to have the same effect – take me to the previous (top-level) screen/activity – even if the user knows about the Back/Up difference. However, by default the Up button will start a new parent activity instead of going back to the previous instance of that activity (as Back would). Users experience this as a loss of data – for instance this <a href="https://github.com/murraycu/android-galaxyzoo/issues/6#issuecomment-64186721">bug</a> and this <a href="https://github.com/murraycu/android-galaxyzoo/issues/14">bug</a>.</p>\n<p>The fix for this depends on the situation:</p>\n<ul>\n<li>In your Up button handler, you can resume your parent activity by <a href="https://github.com/murraycu/android-galaxyzoo/commit/a910d80663ce38ab125223ee9e51512e4ebbe888">passing FLAG_ACTIVITY_CLEAR on an intent that you pass to N<span class="blob-code-inner"><span class="pl-smi">avUtils</span><span class="pl-k">.</span>navigateUpTo</span>()</a>, instead of recreating the activity by just calling <span class="blob-code-inner"><span class="pl-c">NavUtils.navigateUpFromSameTask</span></span>().</li>\n<li>If you know that your top-level parent activity should never have more than one instance, because it can only ever show the one true set of data, you can prevent multiple instances of the activity from being instantiated, by setting <a href="https://github.com/murraycu/android-galaxyzoo/commit/da1347454e0c0f2d7e6c9dd220931e1bd8baeb53">launchMode=singleTop in your AndroidManifest.xm</a>l.</li>\n</ul>\n<h3>Duplicated child fragments</h3>\n<p>My app uses child fragments (fragments in a fragment), which Android needs us to add in code rather than in the layout XML file. Strangely, I sometimes saw duplicate fragments thought it was hard to reproduce it reliably. The answer was to\xa0<a href="https://github.com/murraycu/android-galaxyzoo/commit/7dd2af782464760c6541f694e1ba123180784459"> always use FragmentTransaction.replace() instead of add()</a>.</p>\n<p>\xa0</p></div>\n </div>', 'title': 'android-galaxyzoo: Fixing typical Android bugs', 'date': <GDateTime at 0x5606cd413b60>, 'author_homepage': None, 'url': 'http://www.murrayc.com/permalink/2015/07/14/android-galaxyzoo-fixing-typical-android-bugs/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdf78 (GtkFlowBox at 0x5606cd70ecd0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('hughsie'), returned hughsie
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16cb288 (uninitialized at 0x0)>, {'fullname': 'hughsie', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Inside a windows driver package you’ll probably see a few <code>.dll</code>‘s, a <code>.inf</code> file and a <code>.cat</code> file. If you’ve ever been curious in Windows you’ll have double clicked it and it would show some technical information about the driver and some information about who signed the file.</p>\n<p><img class="aligncenter" height="483" src="http://didierstevens.files.wordpress.com/2008/01/sp2-cat-tab1.png" width="409"/></p>\n<p>We want to use this file to avoid having to get vendors to manually sign the firmware file with a GPG detached signature, which also implies trusting the Microsoft WHQL certificate. These are my notes on my <em>adventure</em> so far.</p>\n<p>There are not many resources on this stuff, and I’d like to thank dwmw2 and dhowels for all their help so far answering all my stupid questions. <a href="https://github.com/theuni/osslsigncode">osslsigncode</a> is also useful to see how other signing is implemented.</p>\n<p>So, the basics. A .cat file is a SMIME PKCS DER file. We can dump the file using:</p>\n<pre>openssl asn1parse -in ecfirmware.cat -inform DER\n</pre>\n<p>and if we were signing just one file we should be able to verify the <code>.cat</code> file with something like this:</p>\n<pre>wget http://www.microsoft.com/pki/certs/MicRooCerAut_2010-06-23.crt\nopenssl x509 -in MicRooCerAut_2010-06-23.crt -inform DER -out ms/msroot.pem -outform PEM\ncat ms/*.pem &gt; ms/certs.pem\nopenssl smime -verify -CAfile ms/certs.pem -in ecfirmware.cat -inform DER -attime $(date +%s --date=2015-01-01) -content ECFirmware.38.7.50.0.cap\nVerification failed\n</pre>\n<p>(Ignore the need to have the root certificate for now, that seems to be a bug in OpenSSL and they probably have bigger fires to fight at this point)</p>\n<p>…but it’s not. We have a pkcs7-signed blob and we need to work out how to get the signature to actually *match* and then we have to work out how to interpret the pkcs7-signed data blob, and use the sha256sums therein to validate the actual data. OpenSSL doesn’t know how to interpret the MS content type OID (1.3.6.1.4.1.311.10.1) so it wimps out and doesn’t put any data into the digest at all.</p>\n<p>We can get the blob using a simple:</p>\n<pre>dd if=ecfirmware.cat of=ecfirmware.cat.payload bs=1 skip=66 count=1340\n</pre>\n<p>…which now verifies:</p>\n<pre>openssl smime -verify -CAfile ms/certs.pem -in ecfirmware.cat -inform DER -attime $(date +%s --date=2015-01-01) -content ecfirmware.cat.payload\nVerification successful\n</pre>\n<p>The blob appears to be a few tables of UTF-16 filename and SHA1/SHA256 checksummed data, encoded in ASN.1 notation. I’ve spent quite a few evenings decompiling the DER file into an ASN file without a whole lot of success (there are 14(!) layers of structures to contend with) and I’ve still not got an ASN file that can correctly parse my DER file for my simple unsigned v1 (<em>ohh yes</em>, v1 = SHA1, v2 = SHA256) test files. There is also a lot of junk data in the blob, and some questionable design choices which mean it’s a huge pain to read. Even if I manage to write the code to read the <code>.cat</code> data blob I’ve then got to populate the data (including the junk data…) so that Windows will accept my file to avoid needing a Microsoft box to generate all firmware images. Also add to the mix that the ASN.1 data is different on different Windows versions (with legacy versions overridden), which explains why you see things like <code>1.3.6.1.4.1.311.12.2.2</code> rather than translated titles in the catalog viewer in Windows XP when trying to view <code>.cat</code> files created on Windows 7.</p>\n<p>I’ve come to the conclusion that writing a library to reliably read and write all versions of <code>.cat</code> files is probably about 3 months work, and that’s 3 months I simply don’t have. Given there isn’t actually a specification (apart from a <a href="https://msdn.microsoft.com/en-us/library/aa380252(v=VS.85).aspx#catalog_definition_functions">super small guide</a> on how to use the MS crypto API) it would also be an uphill battle with every Windows release.</p>\n<p>We could of course do something Linux specific that does the same thing, although that obviously would not work on Windows and means we have to ask the vendors to do an extra step in release engineering. Using GPG would be easiest, but a lot of the hardware vendors seem wed to the PKCS certificate mechanism, and I suppose it does mean you can layer certificates for root trust, vendors and contractors. GPG signing the firmware file only doesn’t actually give us a file-list with the digest values of the other metadata in the .cab file.</p>\n<p>A naive solution would be to do something like this:</p>\n<pre>sha25sum firmware.inf firmware.metainfo.xml firmware.bin &gt; firmware.digest\nopenssl dgst -sha256 -sign cert-private.pem -out firmware.sign firmware.digest\nopenssl dgst -sha256 -verify cert-pubkey.pem -signature firmware.sign firmware.files\n</pre>\n<p>But to actually <em>extract</em> the firmware.digest file we need the <strong>private key</strong>. We can check prepared data using the public key, but that means shipping firmware.digest <em>and</em> firmware.sign when we only really want one file (.cab files checksum the files internally, so we can be sure against data corruption).</p>\n<p>Before I go crazy and invent yet another file format specification does anybody know of a signed digest format with an open specification? Better ideas certainly welcome, thanks.</p>\n<p>Richard.</p></div>\n </div>', 'title': 'Building a better catalog file', 'date': <GDateTime at 0x5606cd3fccc0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/hughsie/2015/07/14/building-a-better-catalog-file/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'hughsie', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Inside a windows driver package you’ll probably see a few <code>.dll</code>‘s, a <code>.inf</code> file and a <code>.cat</code> file. If you’ve ever been curious in Windows you’ll have double clicked it and it would show some technical information about the driver and some information about who signed the file.</p>\n<p><img class="aligncenter" height="483" src="http://didierstevens.files.wordpress.com/2008/01/sp2-cat-tab1.png" width="409"/></p>\n<p>We want to use this file to avoid having to get vendors to manually sign the firmware file with a GPG detached signature, which also implies trusting the Microsoft WHQL certificate. These are my notes on my <em>adventure</em> so far.</p>\n<p>There are not many resources on this stuff, and I’d like to thank dwmw2 and dhowels for all their help so far answering all my stupid questions. <a href="https://github.com/theuni/osslsigncode">osslsigncode</a> is also useful to see how other signing is implemented.</p>\n<p>So, the basics. A .cat file is a SMIME PKCS DER file. We can dump the file using:</p>\n<pre>openssl asn1parse -in ecfirmware.cat -inform DER\n</pre>\n<p>and if we were signing just one file we should be able to verify the <code>.cat</code> file with something like this:</p>\n<pre>wget http://www.microsoft.com/pki/certs/MicRooCerAut_2010-06-23.crt\nopenssl x509 -in MicRooCerAut_2010-06-23.crt -inform DER -out ms/msroot.pem -outform PEM\ncat ms/*.pem &gt; ms/certs.pem\nopenssl smime -verify -CAfile ms/certs.pem -in ecfirmware.cat -inform DER -attime $(date +%s --date=2015-01-01) -content ECFirmware.38.7.50.0.cap\nVerification failed\n</pre>\n<p>(Ignore the need to have the root certificate for now, that seems to be a bug in OpenSSL and they probably have bigger fires to fight at this point)</p>\n<p>…but it’s not. We have a pkcs7-signed blob and we need to work out how to get the signature to actually *match* and then we have to work out how to interpret the pkcs7-signed data blob, and use the sha256sums therein to validate the actual data. OpenSSL doesn’t know how to interpret the MS content type OID (1.3.6.1.4.1.311.10.1) so it wimps out and doesn’t put any data into the digest at all.</p>\n<p>We can get the blob using a simple:</p>\n<pre>dd if=ecfirmware.cat of=ecfirmware.cat.payload bs=1 skip=66 count=1340\n</pre>\n<p>…which now verifies:</p>\n<pre>openssl smime -verify -CAfile ms/certs.pem -in ecfirmware.cat -inform DER -attime $(date +%s --date=2015-01-01) -content ecfirmware.cat.payload\nVerification successful\n</pre>\n<p>The blob appears to be a few tables of UTF-16 filename and SHA1/SHA256 checksummed data, encoded in ASN.1 notation. I’ve spent quite a few evenings decompiling the DER file into an ASN file without a whole lot of success (there are 14(!) layers of structures to contend with) and I’ve still not got an ASN file that can correctly parse my DER file for my simple unsigned v1 (<em>ohh yes</em>, v1 = SHA1, v2 = SHA256) test files. There is also a lot of junk data in the blob, and some questionable design choices which mean it’s a huge pain to read. Even if I manage to write the code to read the <code>.cat</code> data blob I’ve then got to populate the data (including the junk data…) so that Windows will accept my file to avoid needing a Microsoft box to generate all firmware images. Also add to the mix that the ASN.1 data is different on different Windows versions (with legacy versions overridden), which explains why you see things like <code>1.3.6.1.4.1.311.12.2.2</code> rather than translated titles in the catalog viewer in Windows XP when trying to view <code>.cat</code> files created on Windows 7.</p>\n<p>I’ve come to the conclusion that writing a library to reliably read and write all versions of <code>.cat</code> files is probably about 3 months work, and that’s 3 months I simply don’t have. Given there isn’t actually a specification (apart from a <a href="https://msdn.microsoft.com/en-us/library/aa380252(v=VS.85).aspx#catalog_definition_functions">super small guide</a> on how to use the MS crypto API) it would also be an uphill battle with every Windows release.</p>\n<p>We could of course do something Linux specific that does the same thing, although that obviously would not work on Windows and means we have to ask the vendors to do an extra step in release engineering. Using GPG would be easiest, but a lot of the hardware vendors seem wed to the PKCS certificate mechanism, and I suppose it does mean you can layer certificates for root trust, vendors and contractors. GPG signing the firmware file only doesn’t actually give us a file-list with the digest values of the other metadata in the .cab file.</p>\n<p>A naive solution would be to do something like this:</p>\n<pre>sha25sum firmware.inf firmware.metainfo.xml firmware.bin &gt; firmware.digest\nopenssl dgst -sha256 -sign cert-private.pem -out firmware.sign firmware.digest\nopenssl dgst -sha256 -verify cert-pubkey.pem -signature firmware.sign firmware.files\n</pre>\n<p>But to actually <em>extract</em> the firmware.digest file we need the <strong>private key</strong>. We can check prepared data using the public key, but that means shipping firmware.digest <em>and</em> firmware.sign when we only really want one file (.cab files checksum the files internally, so we can be sure against data corruption).</p>\n<p>Before I go crazy and invent yet another file format specification does anybody know of a signed digest format with an open specification? Better ideas certainly welcome, thanks.</p>\n<p>Richard.</p></div>\n </div>', 'title': 'Building a better catalog file', 'date': <GDateTime at 0x5606cd3fccc0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/hughsie/2015/07/14/building-a-better-catalog-file/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdf78 (GtkFlowBox at 0x5606cd70ecd0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('karen'), returned karen
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16cb2d0 (uninitialized at 0x0)>, {'fullname': 'karen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m back from Brazil where I attended FISL. I had the honor of presenting three talks! And they were three of my favorite topics: <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507081907.ogv"> the importance of compliance and the suit against VMware</a>, <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507101600.ogv">bringing more women to free and open source software</a> and <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507111100.ogv">why I care so much about software freedom in the first place</a>. It was a very fun conference. Besides doing the talks I was able to do a few press interviews too. And of course I loved meeting Brazilian hackers and software freedom activists. </p>\n<p>Attendees seemed very interested in enforcement and the <a href="http://sfconservancy.org/linux-compliance/">VMware suit</a>. I was happy to see support for this work, and there was discussion about local copyright holders signing up to the coalition. It really seems that folks are starting to see the downsides of noncopylefted projects and are frustrated by the pervasiveness of GPL violations. </p>\n<p>One of my favorite moments of the conference was the response to my talk about gender diversity. I admit that it’s disappointing that this talk is always attended disporportionately by women. As I sometimes say in the talk itself, it doesn’t make a lot of sense for the burden of this work to fall only on women. There are so few women right now in free software (1-11% at most) that it would be impossible for us to do it on any meaningful scale alone. Plus it’s not fair to expect women to undertake this work on top of their other contributions to free software (many women understandably don’t want to think about gender issues at all). Men can make a tremendous impact on this area. Most of our Outreachy mentors are men, and as the dominant group in free and open surce software, it’s men who can fundamentally change the culture to be more welcoming to women and other underrepresented groups. Nonetheless, it was amazing that the “mob” after my talk was mostly women. It was great to meet so many women who are leaders in Latin America and to hear about their extraordinary work. I was interviewed after the talk and was askd to give some<a href="https://www.youtube.com/watch?v=wy5Xkhywh84"> tips for women getting started in free software.</a></p>\n<p>The conference had a very different feel to it than a lot of the other conferences I attend. It was a community run conference (along with that awesome community feeling, a lot of students, etc.) but it’s such a big conference that it has some things that community conferences often don’t have. Like GNU and Tux mascots (thanks to Deb Nicholson for the photo)!</p>\n<p><a href="https://blogs.gnome.org/gnomg/files/2015/07/karengnutux.jpg"><img alt="karengnutux" class="alignnone size-full wp-image-793" src="https://blogs.gnome.org/gnomg/files/2015/07/karengnutux.jpg" width="550"/></a></p>\n<p>I loved seeing schoolkids excited to be there and quite a number of really little kids with GNU and Freedo shirts and toys.</p>\n<p>There was also a lot of love for GNOME, and it was great to meet up with people I don’t get to see very often, especially since I’m missing <a href="https://2015.guadec.org/">GUADEC this year. Plus we got to </a><a href="https://www.youtube.com/watch?v=zUyUWodqPm8&amp;feature=youtu.be">settle some outstanding Linux kernel/systemd issues</a>.</p>\n<p>FISL is an excellect conference – a wonderful alternative to the corporate trade association conference ciruit. I hope to be able to return some time in the future. Now to get ready for OSCON next week…</p></div>\n </div>', 'title': 'FISL16', 'date': <GDateTime at 0x5606cd3f5c20>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/gnomg/2015/07/14/fisl16/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'karen', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m back from Brazil where I attended FISL. I had the honor of presenting three talks! And they were three of my favorite topics: <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507081907.ogv"> the importance of compliance and the suit against VMware</a>, <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507101600.ogv">bringing more women to free and open source software</a> and <a href="http://hemingway.softwarelivre.org/fisl16/high/40t/sala_40t-high-201507111100.ogv">why I care so much about software freedom in the first place</a>. It was a very fun conference. Besides doing the talks I was able to do a few press interviews too. And of course I loved meeting Brazilian hackers and software freedom activists. </p>\n<p>Attendees seemed very interested in enforcement and the <a href="http://sfconservancy.org/linux-compliance/">VMware suit</a>. I was happy to see support for this work, and there was discussion about local copyright holders signing up to the coalition. It really seems that folks are starting to see the downsides of noncopylefted projects and are frustrated by the pervasiveness of GPL violations. </p>\n<p>One of my favorite moments of the conference was the response to my talk about gender diversity. I admit that it’s disappointing that this talk is always attended disporportionately by women. As I sometimes say in the talk itself, it doesn’t make a lot of sense for the burden of this work to fall only on women. There are so few women right now in free software (1-11% at most) that it would be impossible for us to do it on any meaningful scale alone. Plus it’s not fair to expect women to undertake this work on top of their other contributions to free software (many women understandably don’t want to think about gender issues at all). Men can make a tremendous impact on this area. Most of our Outreachy mentors are men, and as the dominant group in free and open surce software, it’s men who can fundamentally change the culture to be more welcoming to women and other underrepresented groups. Nonetheless, it was amazing that the “mob” after my talk was mostly women. It was great to meet so many women who are leaders in Latin America and to hear about their extraordinary work. I was interviewed after the talk and was askd to give some<a href="https://www.youtube.com/watch?v=wy5Xkhywh84"> tips for women getting started in free software.</a></p>\n<p>The conference had a very different feel to it than a lot of the other conferences I attend. It was a community run conference (along with that awesome community feeling, a lot of students, etc.) but it’s such a big conference that it has some things that community conferences often don’t have. Like GNU and Tux mascots (thanks to Deb Nicholson for the photo)!</p>\n<p><a href="https://blogs.gnome.org/gnomg/files/2015/07/karengnutux.jpg"><img alt="karengnutux" class="alignnone size-full wp-image-793" src="https://blogs.gnome.org/gnomg/files/2015/07/karengnutux.jpg" width="550"/></a></p>\n<p>I loved seeing schoolkids excited to be there and quite a number of really little kids with GNU and Freedo shirts and toys.</p>\n<p>There was also a lot of love for GNOME, and it was great to meet up with people I don’t get to see very often, especially since I’m missing <a href="https://2015.guadec.org/">GUADEC this year. Plus we got to </a><a href="https://www.youtube.com/watch?v=zUyUWodqPm8&amp;feature=youtu.be">settle some outstanding Linux kernel/systemd issues</a>.</p>\n<p>FISL is an excellect conference – a wonderful alternative to the corporate trade association conference ciruit. I hope to be able to return some time in the future. Now to get ready for OSCON next week…</p></div>\n </div>', 'title': 'FISL16', 'date': <GDateTime at 0x5606cd3f5c20>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/gnomg/2015/07/14/fisl16/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdf78 (GtkFlowBox at 0x5606cd70ecd0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('Jesse van den Kieboom'), returned Jesse van den Kieboom
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16cb318 (uninitialized at 0x0)>, {'fullname': 'Jesse van den Kieboom', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m using the thunderbird conversations add-on and am generally quite happy with it. One pain point however is that its quick reply feature has a really small text area for replying. This is especially annoying if you want to reply in-line and have to scroll to relevant parts of the e-mail.</p>\n<p>A quick fix for this:</p>\n<ol>\n<li>Install the Stylish thunderbird add-on</li>\n<li>Add the following style snippet:\n<pre>.quickReply .textarea.selected {\n height: 400px !important;\n}</pre>\n</li>\n</ol>\n<p>Adjust height as preferred.</p></div>\n </div>', 'title': 'Making thunderbird conversations quick reply area larger', 'date': <GDateTime at 0x5606cd3fa4a0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/jessevdk/2015/07/15/making-thunderbird-conversations-quick-reply-area-larger/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'Jesse van den Kieboom', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m using the thunderbird conversations add-on and am generally quite happy with it. One pain point however is that its quick reply feature has a really small text area for replying. This is especially annoying if you want to reply in-line and have to scroll to relevant parts of the e-mail.</p>\n<p>A quick fix for this:</p>\n<ol>\n<li>Install the Stylish thunderbird add-on</li>\n<li>Add the following style snippet:\n<pre>.quickReply .textarea.selected {\n height: 400px !important;\n}</pre>\n</li>\n</ol>\n<p>Adjust height as preferred.</p></div>\n </div>', 'title': 'Making thunderbird conversations quick reply area larger', 'date': <GDateTime at 0x5606cd3fa4a0>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/jessevdk/2015/07/15/making-thunderbird-conversations-quick-reply-area-larger/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdf78 (GtkFlowBox at 0x5606cd70ecd0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('felipeborges'), returned felipeborges
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16cb360 (uninitialized at 0x0)>, {'fullname': 'felipeborges', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p/>\n<p>A nice feature Apple has is the ability of accessing a window-specific dialog right from their title bar.</p>\n<p><a href="https://pbs.twimg.com/media/CH0hIGRWIAAe2LC.png:large"><img alt="" class="aligncenter" height="230" src="https://pbs.twimg.com/media/CH0hIGRWIAAe2LC.png:large" width="582"/></a></p>\n<p>\xa0</p>\n<p>I think that would be pretty useful in Documents’ context as well. So I’ve written this <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751189" target="_blank">small patch</a>.</p>\n<p>I’ve been pointed out that it duplicates the access to the Properties dialog. We already have that on the hamburger menu. But still, I think that would be cool. <strong>What do you think?</strong></p></div>\n </div>', 'title': 'Documents idea: rename documents right from the title bar', 'date': <GDateTime at 0x5606cd403600>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/felipeborges/proposal-proprierties-title-bar/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'felipeborges', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p/>\n<p>A nice feature Apple has is the ability of accessing a window-specific dialog right from their title bar.</p>\n<p><a href="https://pbs.twimg.com/media/CH0hIGRWIAAe2LC.png:large"><img alt="" class="aligncenter" height="230" src="https://pbs.twimg.com/media/CH0hIGRWIAAe2LC.png:large" width="582"/></a></p>\n<p>\xa0</p>\n<p>I think that would be pretty useful in Documents’ context as well. So I’ve written this <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751189" target="_blank">small patch</a>.</p>\n<p>I’ve been pointed out that it duplicates the access to the Properties dialog. We already have that on the hamburger menu. But still, I think that would be cool. <strong>What do you think?</strong></p></div>\n </div>', 'title': 'Documents idea: rename documents right from the title bar', 'date': <GDateTime at 0x5606cd403600>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/felipeborges/proposal-proprierties-title-bar/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdf78 (GtkFlowBox at 0x5606cd70ecd0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('felipeborges'), returned felipeborges
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16cb3a8 (uninitialized at 0x0)>, {'fullname': 'felipeborges', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The GNOME Project has released GNOME 3.12 today.\xa0Congratulations to all the approximately 1140 contributors\xa0that made 34236\xa0really awesome changes in this release.</p>\n<p>Bastian Hougaard and Karen Sandler (GNOME Executive Director) have made an<em> Introducing GNOME 3.12</em> video, check it out!</p>\n<p>Don’t forget to check the <a href="https://help.gnome.org/misc/release-notes/3.12/" target="_blank" title="GNOME 3.12 Release notes">release notes</a>. If you’re a hardcore Fedora user, you can get GNOME 3.12 using <a href="https://copr.fedoraproject.org/coprs/rhughes/f20-gnome-3-12/" target="_blank" title="rhughes / f20-gnome-3-12">Richard Hughes’ rpm\xa0repository</a>.</p></div>\n </div>', 'title': 'GNOME 3.12 Released!', 'date': <GDateTime at 0x5606cd406320>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/felipeborges/gnome-3-12-released/', 'is_read': False, 'author_email': None}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'felipeborges', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The GNOME Project has released GNOME 3.12 today.\xa0Congratulations to all the approximately 1140 contributors\xa0that made 34236\xa0really awesome changes in this release.</p>\n<p>Bastian Hougaard and Karen Sandler (GNOME Executive Director) have made an<em> Introducing GNOME 3.12</em> video, check it out!</p>\n<p>Don’t forget to check the <a href="https://help.gnome.org/misc/release-notes/3.12/" target="_blank" title="GNOME 3.12 Release notes">release notes</a>. If you’re a hardcore Fedora user, you can get GNOME 3.12 using <a href="https://copr.fedoraproject.org/coprs/rhughes/f20-gnome-3-12/" target="_blank" title="rhughes / f20-gnome-3-12">Richard Hughes’ rpm\xa0repository</a>.</p></div>\n </div>', 'title': 'GNOME 3.12 Released!', 'date': <GDateTime at 0x5606cd406320>, 'author_homepage': None, 'url': 'https://blogs.gnome.org/felipeborges/gnome-3-12-released/', 'is_read': False, 'author_email': None}, <FlowBox object at 0x7f7fa16bdf78 (GtkFlowBox at 0x5606cd70ecd0)>), returned None
15:25:13 DEBUG post.py:60 ||||||gnomenews.post.sanitize_author('Adrien Plazas'), returned Adrien Plazas
15:25:13 DEBUG post.py:40 |||||gnomenews.post.__init__(<Post object at 0x7f7fa16cb3f0 (uninitialized at 0x0)>, {'fullname': 'Adrien Plazas', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Lasse and I spent some time recently to produce a Beamer template for GUADEC 2015. You can find it here: <a href="https://github.com/sils1297/guadec-presentation-templates">github.com/sils1297/guadec-presentation-templates</a>.</p> <div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-6PW1Sb5MY1E/VaZ-dFjlg8I/AAAAAAAAAIo/aU3mEN-XNoE/s1600/guadec-2015-beamer-title.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-6PW1Sb5MY1E/VaZ-dFjlg8I/AAAAAAAAAIo/aU3mEN-XNoE/s480/guadec-2015-beamer-title.png"/></a></div> <p>You can use it with Pandoc or directly with LaTeX. Example are shipped too:</p><ul> <li><b>2015/presentation.md</b> is a Pandoc example, build it with <b>make pandoc</b> to produce <b>2015/presentation.pdf</b>;</li> <li>2015/guadec-example.tex is a LaTeX example, build it with <b>make tex</b> to produce <b>2015/guadec-example.pdf</b>.</li></ul> <div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-aRFsmgeMhlc/VaZ-deyNkVI/AAAAAAAAAIs/ZBjM9z9sSBo/s1600/guadec-2015-beamer-slide.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-aRFsmgeMhlc/VaZ-deyNkVI/AAAAAAAAAIs/ZBjM9z9sSBo/s480/guadec-2015-beamer-slide.png"/></a></div> <p>I hope you\'ll enjoy it, feedback is welcome and if you have any problem don\'t hesitate to contact me (Kekun) or Lasse (sils) GIMPNet <a href="irc://irc.gimp.org/#guadec">#guadec on GIMPNet</a>.</p></div>\n </div>', 'title': 'GUADEC 2015 get its Beamer template!', 'date': <GDateTime at 0x5606cd3f0c00>, 'author_homepage': 'https://plus.google.com/112791072160767246710', 'url': 'http://bytesgnomeschozo.blogspot.com/2015/07/guadec-2015-get-its-beamer-template.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}), returned None
15:25:13 DEBUG view.py:80 ||||gnomenews.view._add_a_new_preview(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'fullname': 'Adrien Plazas', 'content': '<div xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Lasse and I spent some time recently to produce a Beamer template for GUADEC 2015. You can find it here: <a href="https://github.com/sils1297/guadec-presentation-templates">github.com/sils1297/guadec-presentation-templates</a>.</p> <div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-6PW1Sb5MY1E/VaZ-dFjlg8I/AAAAAAAAAIo/aU3mEN-XNoE/s1600/guadec-2015-beamer-title.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-6PW1Sb5MY1E/VaZ-dFjlg8I/AAAAAAAAAIo/aU3mEN-XNoE/s480/guadec-2015-beamer-title.png"/></a></div> <p>You can use it with Pandoc or directly with LaTeX. Example are shipped too:</p><ul> <li><b>2015/presentation.md</b> is a Pandoc example, build it with <b>make pandoc</b> to produce <b>2015/presentation.pdf</b>;</li> <li>2015/guadec-example.tex is a LaTeX example, build it with <b>make tex</b> to produce <b>2015/guadec-example.pdf</b>.</li></ul> <div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-aRFsmgeMhlc/VaZ-deyNkVI/AAAAAAAAAIs/ZBjM9z9sSBo/s1600/guadec-2015-beamer-slide.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-aRFsmgeMhlc/VaZ-deyNkVI/AAAAAAAAAIs/ZBjM9z9sSBo/s480/guadec-2015-beamer-slide.png"/></a></div> <p>I hope you\'ll enjoy it, feedback is welcome and if you have any problem don\'t hesitate to contact me (Kekun) or Lasse (sils) GIMPNet <a href="irc://irc.gimp.org/#guadec">#guadec on GIMPNet</a>.</p></div>\n </div>', 'title': 'GUADEC 2015 get its Beamer template!', 'date': <GDateTime at 0x5606cd3f0c00>, 'author_homepage': 'https://plus.google.com/112791072160767246710', 'url': 'http://bytesgnomeschozo.blogspot.com/2015/07/guadec-2015-get-its-beamer-template.html', 'is_read': False, 'author_email': 'noreply@blogger.com'}, <FlowBox object at 0x7f7fa16bdf78 (GtkFlowBox at 0x5606cd70ecd0)>), returned None
15:25:13 DEBUG view.py:100 |||gnomenews.view._add_new_feed(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, {'url': 'https://planet.gnome.org/atom.xml', 'title': 'Planet GNOME'}), returned None
15:25:13 DEBUG view.py:144 ||gnomenews.view.update_feeds(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>), returned None
15:25:13 DEBUG view.py:260 |gnomenews.view.update(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>), returned None
15:25:13 DEBUG window.py:102 gnomenews.window.view_changed(<Window object at 0x7f7fa16a1dc8 (gnomenews+window+Window at 0x5606cd512270)>, <Stack object at 0x7f7fa16adf78 (GtkStack at 0x5606cd6d06d0)>, <GParamObject 'visible-child'>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16bdb40 (gnomenews+post+Post at 0x5606cd413360)>, <Post object at 0x7f7fa16bdb40 (gnomenews+post+Post at 0x5606cd413360)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bdb40 (gnomenews+post+Post at 0x5606cd413360)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16bd798 (gnomenews+post+Post at 0x5606cd417c60)>, <Post object at 0x7f7fa16bd798 (gnomenews+post+Post at 0x5606cd417c60)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bd798 (gnomenews+post+Post at 0x5606cd417c60)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16bdd38 (gnomenews+post+Post at 0x5606cd406020)>, <Post object at 0x7f7fa16bdd38 (gnomenews+post+Post at 0x5606cd406020)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bdd38 (gnomenews+post+Post at 0x5606cd406020)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16bdd80 (gnomenews+post+Post at 0x5606cd3ee420)>, <Post object at 0x7f7fa16bdd80 (gnomenews+post+Post at 0x5606cd3ee420)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bdd80 (gnomenews+post+Post at 0x5606cd3ee420)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16bddc8 (gnomenews+post+Post at 0x5606cd413d00)>, <Post object at 0x7f7fa16bddc8 (gnomenews+post+Post at 0x5606cd413d00)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bddc8 (gnomenews+post+Post at 0x5606cd413d00)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16bde10 (gnomenews+post+Post at 0x5606cd403a00)>, <Post object at 0x7f7fa16bde10 (gnomenews+post+Post at 0x5606cd403a00)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bde10 (gnomenews+post+Post at 0x5606cd403a00)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16bde58 (gnomenews+post+Post at 0x5606cd417ca0)>, <Post object at 0x7f7fa16bde58 (gnomenews+post+Post at 0x5606cd417ca0)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bde58 (gnomenews+post+Post at 0x5606cd417ca0)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16bdea0 (gnomenews+post+Post at 0x5606cd413a40)>, <Post object at 0x7f7fa16bdea0 (gnomenews+post+Post at 0x5606cd413a40)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bdea0 (gnomenews+post+Post at 0x5606cd413a40)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16bdee8 (gnomenews+post+Post at 0x5606cd404580)>, <Post object at 0x7f7fa16bdee8 (gnomenews+post+Post at 0x5606cd404580)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bdee8 (gnomenews+post+Post at 0x5606cd404580)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16bdf30 (gnomenews+post+Post at 0x5606cd414c00)>, <Post object at 0x7f7fa16bdf30 (gnomenews+post+Post at 0x5606cd414c00)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16bdf30 (gnomenews+post+Post at 0x5606cd414c00)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16cb048 (gnomenews+post+Post at 0x5606cd4056a0)>, <Post object at 0x7f7fa16cb048 (gnomenews+post+Post at 0x5606cd4056a0)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16cb048 (gnomenews+post+Post at 0x5606cd4056a0)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16cb1b0 (gnomenews+post+Post at 0x5606cd414ba0)>, <Post object at 0x7f7fa16cb1b0 (gnomenews+post+Post at 0x5606cd414ba0)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16cb1b0 (gnomenews+post+Post at 0x5606cd414ba0)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16cb1f8 (gnomenews+post+Post at 0x5606cd413b40)>, <Post object at 0x7f7fa16cb1f8 (gnomenews+post+Post at 0x5606cd413b40)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16cb1f8 (gnomenews+post+Post at 0x5606cd413b40)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16cb240 (gnomenews+post+Post at 0x5606cd401e20)>, <Post object at 0x7f7fa16cb240 (gnomenews+post+Post at 0x5606cd401e20)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16cb240 (gnomenews+post+Post at 0x5606cd401e20)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16cb288 (gnomenews+post+Post at 0x5606cd415900)>, <Post object at 0x7f7fa16cb288 (gnomenews+post+Post at 0x5606cd415900)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16cb288 (gnomenews+post+Post at 0x5606cd415900)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16cb2d0 (gnomenews+post+Post at 0x5606cd414d80)>, <Post object at 0x7f7fa16cb2d0 (gnomenews+post+Post at 0x5606cd414d80)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16cb2d0 (gnomenews+post+Post at 0x5606cd414d80)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16cb318 (gnomenews+post+Post at 0x5606cd3f6c80)>, <Post object at 0x7f7fa16cb318 (gnomenews+post+Post at 0x5606cd3f6c80)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16cb318 (gnomenews+post+Post at 0x5606cd3f6c80)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16cb360 (gnomenews+post+Post at 0x5606cd412ee0)>, <Post object at 0x7f7fa16cb360 (gnomenews+post+Post at 0x5606cd412ee0)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16cb360 (gnomenews+post+Post at 0x5606cd412ee0)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16cb3a8 (gnomenews+post+Post at 0x5606cd414660)>, <Post object at 0x7f7fa16cb3a8 (gnomenews+post+Post at 0x5606cd414660)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16cb3a8 (gnomenews+post+Post at 0x5606cd414660)>), returned None
15:25:13 DEBUG view.py:89 |gnomenews.view._insert_post(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <Post object at 0x7f7fa16cb3f0 (gnomenews+post+Post at 0x5606cd416260)>, <Post object at 0x7f7fa16cb3f0 (gnomenews+post+Post at 0x5606cd416260)>), returned None
15:25:13 DEBUG post.py:79 gnomenews.post.try_to_load_image_from_cache(<Post object at 0x7f7fa16cb3f0 (gnomenews+post+Post at 0x5606cd416260)>), returned None
15:25:15 WARNING Error showing popover: 'bool' object is not callable
15:25:15 DEBUG view.py:264 gnomenews.view._on_button_release(<FeedsView object at 0x7f7fa16b0438 (gnomenews+view+FeedsView at 0x5606cd6d0c10)>, <ListBox object at 0x7f7fa16b0750 (GtkListBox at 0x5606cd295310)>, <void at 0x5606cdebf070>), returned True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment