tag:blogger.com,1999:blog-5034897195455852062024-03-13T23:09:38.821+01:00Kobliha's blogKoblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.comBlogger53125tag:blogger.com,1999:blog-503489719545585206.post-58205442863047738262016-11-02T13:52:00.001+01:002016-11-02T13:52:00.924+01:00Ruby Meetup Prague @SUSE<div style="text-align: left;">
Good news everyone: There will be a <span style="color: #cc0000;">"Ruby Meetup Prague"</span> next week at SUSE Linux offices (Thursday, 10th November, 6 PM).</div>
<div style="text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-4nV7MHRGP3Q/WBnccSm5wYI/AAAAAAAAFnA/NeSD3Pwg4Z4tYKXt6WTQYJc0bKV7_-NNgCLcB/s1600/Ruby%2BMeetup%2BPrague.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://2.bp.blogspot.com/-4nV7MHRGP3Q/WBnccSm5wYI/AAAAAAAAFnA/NeSD3Pwg4Z4tYKXt6WTQYJc0bKV7_-NNgCLcB/s1600/Ruby%2BMeetup%2BPrague.png" /></a></div>
<br /></div>
<div style="text-align: left;">
Although its "Ruby" meetup, it usually isn't just about Ruby. The programming language itself is not that important. Important is the reason: To connect great minds, ideas and solutions together.<br />
<br />
Among others, our YaST team has got a great chance to have three presentations there:</div>
<div style="text-align: left;">
<ul>
<li>Ladislav Slezak - <i>Ruby Debugger in SUSE Installer</i></li>
<li>Josef Reidinger -<i> Continuous Deployment of a Big Project (GitHub, Rake, Build Service, Jenkins, ...)</i></li>
<li>Martin Vidner - <i>Static Code Analysis - The Failure with Ruby-lint</i></li>
</ul>
<div>
If you want to read more about the meetup, e.g., the program or (optionally) register for the event, surf to <a href="http://www.meetup.com/Prague-Ruby-Meetup/events/235001893/" target="_blank">this official page</a>. Presentations will be in the Czech language.</div>
</div>
Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-53803362147355671692016-10-07T15:15:00.000+02:002016-10-07T15:15:18.026+02:00ERR_NETWORK_CHANGED in Chrome/Chomium @openSUSE_Tumbeweed @DELL_5510<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-xnleYM-xgLg/V_eVKj7odDI/AAAAAAAAFls/6LOT9_mrMxEjE2UEqYSIiTjaZN7psuvYgCLcB/s1600/ERR_NETWORK_CHANGED.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="187" src="https://1.bp.blogspot.com/-xnleYM-xgLg/V_eVKj7odDI/AAAAAAAAFls/6LOT9_mrMxEjE2UEqYSIiTjaZN7psuvYgCLcB/s200/ERR_NETWORK_CHANGED.png" width="200" /></a></div>
I've started seeing this error - <b>ERR_NETWORK_CHANGED</b> - regularly in Chrome recently. This had some nasty side effects such as Trello reporting that the board I was using does not exist, etc. without any simple possibility to recover from that issue. At first I thought that it was caused by Chrome itself, especially as everything seemed to work well in Firefox, but as Firefox did not fit my needs, I tried switching to Chromium and started seeing the same error after a while again. That made me search for some simple solution.<div>
<br /></div>
<div>
Almost all I found was related to some other operating system, but at least I found a great debugging feature in Chrome. You will find it at this location: <a href="chrome://net-internals/#events">chrome://net-internals/#events</a> (obviously in Chrome/Chromium only). And there were many errors <b>NETWORK_IP_ADDRESSES_CHANGED</b> - appearing basically every second.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-tvGz2GEaGg8/V_eYuibMsmI/AAAAAAAAFl4/Czv3VVNGz5ILRjIUvmFN5Wy66rAyrTymQCLcB/s1600/ERR_NETWORK_CHANGED-yast.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="228" src="https://3.bp.blogspot.com/-tvGz2GEaGg8/V_eYuibMsmI/AAAAAAAAFl4/Czv3VVNGz5ILRjIUvmFN5Wy66rAyrTymQCLcB/s320/ERR_NETWORK_CHANGED-yast.png" width="320" /></a></div>
<div>
Anyway, long story short. After trying a few other things, I've decided to switch from using <b>NetworkManager</b> to <b>Wicked</b>. Well, yes, even if that basically turns my laptop into a desktop machine. </div>
<div>
<ul>
<li>Good news #1 I've stopped seeing these errors instantly</li>
<li>Good news #2 I haven't started seeing any other errors either</li>
</ul>
You can simply switch the networking option in <a href="https://github.com/yast/yast-network" target="_blank">YaST</a>. Just run <b>yast2 lan</b> as root. In <i>Global Options</i>, switch <i>General Network Settings</i> from <i>NetworkManager</i> to <i>Wicked</i> and save the settings with <i>OK</i>.</div>
<div>
<br /></div>
<div>
Currently installed packages</div>
<div>
<ul>
<li>google-chrome-stable-53.0.2785</li>
<li>NetworkManager-1.4.0</li>
</ul>
</div>
Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-15051391875535961772016-09-02T12:29:00.000+02:002016-09-06T22:28:47.915+02:00Looking for a True Linux Hero<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-y9CmDFqy4xc/V8k45OOUHqI/AAAAAAAAFkY/uXDF424E5dAOCwmxyRhdg3UOGhkh5rG6QCLcB/s1600/Hero%2BStefan.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-y9CmDFqy4xc/V8k45OOUHqI/AAAAAAAAFkY/uXDF424E5dAOCwmxyRhdg3UOGhkh5rG6QCLcB/s320/Hero%2BStefan.jpg" width="193" /></a></div>
We are looking for a <a href="https://jobs.suse.com/job/nuremberg/linux-c-ruby-hero-global-location/3486/2930771" target="_blank">True Linux Hero (or Heroine)</a>, who would ideally know how to code in <i>C++</i> and who would also love <i>Ruby</i> (well, at least like it). If you are the one, join our gang, be part of the team. We offer an interesting quest or something new to learn every day.<br />
<br />
What does our team do? We install and configure your openSUSE and SUSE Linux Enterprise - and we really enjoy it! All our code is open-source and you can find it at <a href="https://github.com/yast" target="_blank">GitHub</a>. We also have a wonderful <a href="http://yast.github.io/" target="_blank">developer's documentation</a>. You can reach us at irc.freenode.net, channel #yast and have a chat about <a href="https://jobs.suse.com/job/nuremberg/linux-c-ruby-hero-global-location/3486/2930771" target="_blank">THE JOB</a> we offer. You might be also interested in other <a href="https://www.suse.com/company/careers" target="_blank">jobs at SUSE</a>.<br />
<br />
Let's meet Stefan Kunze, another Linux Hero. He grew in Borna, a small town in Germany close to Leipzig. He joined SUSE and moved to Prague in 2008 after doing an openSUSE support for two years in another company. Stefan now helps our customers at the Front-line Support (you see? front-line - a hero!). He enjoys playing computer games (he's the best at Civilization), reading and a good food.<br />
<br />
We don't work for SUSE, we <b>are</b> SUSE.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-60199001206865099612016-07-01T16:46:00.000+02:002016-07-01T16:46:24.297+02:00HackWeek XIV @SUSE: Thursday<h2>
The Taste of Avocado</h2>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-Vx3cnt0f0HI/V3Z5XbLi4qI/AAAAAAAAFhs/vtn_LM3iTpEHLT0S9mHznn_bfA-fT74dACLcB/s1600/Thursday%2BAvocado.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="131" src="https://1.bp.blogspot.com/-Vx3cnt0f0HI/V3Z5XbLi4qI/AAAAAAAAFhs/vtn_LM3iTpEHLT0S9mHznn_bfA-fT74dACLcB/s200/Thursday%2BAvocado.JPG" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Mr. Viktor Avocado</td></tr>
</tbody></table>
Viktor and Zdenek have been <a href="https://hackweek.suse.com/14/projects/1788" target="_blank">trying</a> the <a href="https://avocado-framework.github.io/" target="_blank">Avocado</a> Framework to be used for our automatic regression tests instead of <a href="https://autotest.github.io/" target="_blank">Autotest</a>. They were quite successful in breaking the stuff first to actually succeed at the end. They have also subscribed for giving the presentation about the project on Friday.<br />
<br />
Avocado provides the framework for running tests written in any programming language, but it additionally provides useful <a href="http://avocado-framework.readthedocs.io/en/latest/ReferenceGuide.html#libraries-apis" target="_blank">API</a> for tests written in Python. For those, who want to try Avocado themselves, there is <a href="https://build.opensuse.org/package/show/Virtualization:Tests/avocado" target="_blank">an RPM</a> built for openSUSE at our <a href="https://build.opensuse.org/" target="_blank">build service</a>.<br />
<h2>
Windows 10 in openQA</h2>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-aNNXsmpZiPY/V3Z6D9gKEzI/AAAAAAAAFh0/WluPOqxRh1ki29KLXuXeR3NNZQ3p2B7rgCLcB/s1600/Thursday%2BWin10.JPG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="131" src="https://2.bp.blogspot.com/-aNNXsmpZiPY/V3Z6D9gKEzI/AAAAAAAAFh0/WluPOqxRh1ki29KLXuXeR3NNZQ3p2B7rgCLcB/s200/Thursday%2BWin10.JPG" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Happy Jozef and his Windows</td></tr>
</tbody></table>
Jozef's project was to install and use Windows 10 in openQA because we, of course, support dual-boot <i>openSUSE/Windows</i> scenario and want to make sure that we don't break it in the future.<br />
<br />
Jozef was mainly struggling with the fact that openQA (KVM) uses SCSI disks, but Windows did not support them by default. There are several ways how to overcome this issue. Some solutions can be found either <a href="http://ubuntuforums.org/showthread.php?t=2289210" target="_blank">here</a> or <a href="https://fedoraproject.org/wiki/Windows_Virtio_Drivers" target="_blank">there</a>.<br />
<br />
At the end, Jozef has succeeded and this new automated regression test will be added to our <a href="https://openqa.opensuse.org/" target="_blank">openQA</a> - a great continuous integration framework. Well done!<br />
<h2>
Jenkins Dashboard - Putting The Pieces Together</h2>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-bDWgkcW4t90/V3Z_YTks9CI/AAAAAAAAFiE/oKsHGY-MglE5D_TrEjHdArl05ldoPr-0QCLcB/s1600/Thursday%2BJenkins%2BDashboard.JPG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="131" src="https://2.bp.blogspot.com/-bDWgkcW4t90/V3Z_YTks9CI/AAAAAAAAFiE/oKsHGY-MglE5D_TrEjHdArl05ldoPr-0QCLcB/s200/Thursday%2BJenkins%2BDashboard.JPG" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tomas doing a small talk with Slenkins</td></tr>
</tbody></table>
Tomas worked on a <a href="https://hackweek.suse.com/14/projects/1808" target="_blank">Dashboard</a> for showing the current state of our Jenkins/Slenkins instance used for running package regression tests. The UI should be similar to what we are getting from openQA nowadays.<br />
<br />
The project itself already has a working prototype and uses as much as possible from other libraries and frameworks (<a href="http://pharo.org/" target="_blank">Pharo</a>, <a href="http://www.seaside.st/" target="_blank">Seaside</a>, <a href="http://getbootstrap.com/" target="_blank">Bootstrap</a>) and also uses the <a href="https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API" target="_blank">Jenkins XML API</a> for getting the data to show.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-73191667468013067652016-06-30T16:18:00.002+02:002016-06-30T16:19:40.011+02:00HackWeek XIV @SUSE: Wednesday<h2>
Gordon: Automagic Testsuite for Crowbar</h2>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-YFVL-SHdgJk/V3UjmVdhahI/AAAAAAAAFhM/KVckYn8EvlMMoFvrsU1N74mZ2ehqBLgBQCLcB/s1600/Wednesday%2BGordon.JPG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="131" src="https://1.bp.blogspot.com/-YFVL-SHdgJk/V3UjmVdhahI/AAAAAAAAFhM/KVckYn8EvlMMoFvrsU1N74mZ2ehqBLgBQCLcB/s200/Wednesday%2BGordon.JPG" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Evgeny making Gordon <span style="color: #38761d;"><b>green</b></span></td></tr>
</tbody></table>
What does not need to be done manually, should not be done manually. If you have a set of tests that you always need to run before you release a maintenance update, automate it. This saves you time for the cool stuff.<br />
<br />
Evgeny's HackWeek <a href="https://hackweek.suse.com/14/projects/1384" target="_blank">project</a> is to automate various crowbar tests using <a href="https://splinter.readthedocs.io/en/latest/" target="_blank">Splinter</a> - a powerful, easy-to-use library, written in Python, for testing web-based applications. There is an animation demonstrating how it flies in action at the <a href="https://github.com/Evalle/gordon" target="_blank">GitHub project page</a>.<br />
<br />
The plan is to integrate this project into the official QA Maintenance testsuite and speed-up the process of releasing updates while still being sure that everything works as expected.<br />
<br />
<h2>
Deploying Testing HA Cluster in VMs Easily</h2>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-BxJhKox2sC0/V3Uo-PBVyOI/AAAAAAAAFhc/HqpkDEdIFmgkz0zQ37wYgicbcX7KkEVPACLcB/s1600/Wednesday%2BHA.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="140" src="https://4.bp.blogspot.com/-BxJhKox2sC0/V3Uo-PBVyOI/AAAAAAAAFhc/HqpkDEdIFmgkz0zQ37wYgicbcX7KkEVPACLcB/s200/Wednesday%2BHA.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Screenshot from the video</td></tr>
</tbody></table>
Another great example of saving a lot of time is <a href="https://hackweek.suse.com/14/projects/1570" target="_blank">Antoine's project</a> for deploying a testing HA cluster using several virtual machines. All is written in Bash and it's easy to understand thanks to a well-commented code and help.<br />
<br />
You can find an extensive documentation and explanation at the respective <a href="https://github.com/aginies/Deploy_HA_SLE_cluster" target="_blank">GitHub project</a>. Including three YouTube videos [<a href="https://www.youtube.com/watch?v=y0herkr6x-A" target="_blank">video #1</a>], [<a href="https://www.youtube.com/watch?v=vmUpaabYV-o" target="_blank">video #2</a>], [<a href="https://www.youtube.com/watch?v=k77sa9y6Lwk" target="_blank">video #3</a>] showing the beast in action!<br />
<br />
If you ever wanted to explore how HA works, this is the right project to start with. Antoine is looking for your feedback.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-82402033126363357252016-06-29T13:42:00.002+02:002016-06-30T10:15:01.964+02:00HackWeek XIV @SUSE: Tuesday<h2>
YaST Code Closer to the Ruby World</h2>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-hbbc19STl7I/V3OjZ87cd-I/AAAAAAAAFg4/llD4y8vD_iwAgb5Ub-RdAyNqMDr8P0fGwCLcB/s1600/Tuesday%2B-%2BBrainstorming.JPG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="131" src="https://4.bp.blogspot.com/-hbbc19STl7I/V3OjZ87cd-I/AAAAAAAAFg4/llD4y8vD_iwAgb5Ub-RdAyNqMDr8P0fGwCLcB/s200/Tuesday%2B-%2BBrainstorming.JPG" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Yast team brainstorming</td></tr>
</tbody></table>
There is a long-running YaST <a href="https://gist.github.com/imobach/d90940315bd0471ee00b2a68ba22fbe5" target="_blank">project</a>, <a href="https://lists.opensuse.org/yast-devel/2016-05/msg00049.html" target="_blank">driven by Imobach</a>, that should bring YaST code (which is written in Ruby) closer to expectations and conventions of any common Ruby project. There are several reasons for that. For instance, we'd like to enable Yast classes to be packaged as Ruby Gems and to lower the entry barrier for any Ruby developer in general. So, files should be in directories where you expect them and their names and class names should match.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-YPxbBHec7wU/V3OjZ3ZWyGI/AAAAAAAAFhA/uP61qpmq3Z8mk7OpaYOmSIiS92wEa0XHACKgB/s1600/Tuesday%2B-%2BDirectory%2BStructure.JPG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="111" src="https://2.bp.blogspot.com/-YPxbBHec7wU/V3OjZ3ZWyGI/AAAAAAAAFhA/uP61qpmq3Z8mk7OpaYOmSIiS92wEa0XHACKgB/s200/Tuesday%2B-%2BDirectory%2BStructure.JPG" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Fragments of the project output</td></tr>
</tbody></table>
As there is a <a href="https://hackweek.suse.com/" target="_blank">HackWeek</a> at SUSE and Imo, Knut and Ancor were visiting the Prague office, we took the chance to discuss this in person and we have a plan how this should look like in the future. During our discussion, we have found out that we might need yet another course in handwriting (after leaving the primary school years ago).<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-Jvg1i_6Fb_A/V3OjZ-uDqUI/AAAAAAAAFhA/JE39LcFOt2Ucc_WiMijfm0aXhHhYalUqACKgB/s1600/Tuesday%2B-%2BESP%2Band%2BCZ.JPG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="131" src="https://2.bp.blogspot.com/-Jvg1i_6Fb_A/V3OjZ-uDqUI/AAAAAAAAFhA/JE39LcFOt2Ucc_WiMijfm0aXhHhYalUqACKgB/s200/Tuesday%2B-%2BESP%2Band%2BCZ.JPG" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Let's have some beer now :)</td></tr>
</tbody></table>
Now it's time to document our plan and start working on the proof of concept, but the ship has already started moving to the right direction. This will be particularly challenging with the number of Yast libraries we currently maintain.<br />
<br />
<h2>
Static Ruby Code Analysis with ruby-lint</h2>
Martin works on an interesting project that should help Yast to identify unused and misused variables and methods (and more). See an example of badly-used code and the output of ruby-lint in the <a href="https://hackweek.suse.com/14/projects/1580" target="_blank">project itself</a>.<br />
<br />
<h2>
Orca: an Intelligent Ceph Testing</h2>
SUSE has already released a version 3 of <a href="https://www.suse.com/products/suse-enterprise-storage" target="_blank">SUSE Enterprise Storage</a> based on <a href="https://en.wikipedia.org/wiki/Ceph_(software)" target="_blank">Ceph</a> which is highly-scalable, fault-tolerant and self-healing by definition, but we'd like to enhance it even more by finding the bottlenecks, by being as mean and cruel as possible to find it's limits. Then we'd like to focus on what we will find and make it even more robust in the future.<br />
<br />
This all needs an intelligent creature (or even a herd of creatures attacking together and having fun of that). A creature that is able to inspect, learn and attack and also learn from its failure. All this (and even more) should be the result of five brave developers lead by Lars working on project <a href="https://hackweek.suse.com/14/projects/1544" target="_blank">Orca: Hunting Cephalopods for Fun and Dinner</a>.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-48587853672562820422016-06-27T16:33:00.002+02:002016-06-27T16:35:29.053+02:00It's HackWeek @SUSE Again!<h2>
We Have Just Started!</h2>
<div>
This is our fourteenth HackWeek at SUSE already. HackWeek is a SUSE way of <a href="https://en.wikipedia.org/wiki/Hackathon" target="_blank">Hackathon</a></div>
<div>
which is usually one full week long. This time it's actually six days, overlapping one day with the <a href="https://events.opensuse.org/" target="_blank">openSUSE conference</a> in Nürnberg. See more including current projects at the HackWeek <a href="https://hackweek.suse.com/" target="_blank">page</a>.</div>
<div>
<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="https://2.bp.blogspot.com/-mNMMnGT5NTA/V3EPnrcuWRI/AAAAAAAAFfw/G9dlnwlNdOMxv16pNTgFY4K8gjJT8KA9gCLcB/s1600/Monday%2B-%2BAll%2BSUSE%2BGuys.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="196" src="https://2.bp.blogspot.com/-mNMMnGT5NTA/V3EPnrcuWRI/AAAAAAAAFfw/G9dlnwlNdOMxv16pNTgFY4K8gjJT8KA9gCLcB/s400/Monday%2B-%2BAll%2BSUSE%2BGuys.JPG" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>SUSE Prague at the HackWeek XIV Opening Event</i></td></tr>
</tbody></table>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;"><span style="background-color: rgba(246, 246, 246, 0.701961); font-size: 14px; line-height: 20px;">Although we have started on Friday and it's just Monday, we already have quite some results to show...</span></span></div>
<h2>
YaST Dialog Editor</h2>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-YedG2_RxtM4/V3EVBANOV9I/AAAAAAAAFgA/eE0mwqqjHiAXocouDf99UtLzWzo9Vw-AwCLcB/s1600/Monday%2B-%2BYaST%2BGuys%2B1.JPG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="132" src="https://1.bp.blogspot.com/-YedG2_RxtM4/V3EVBANOV9I/AAAAAAAAFgA/eE0mwqqjHiAXocouDf99UtLzWzo9Vw-AwCLcB/s200/Monday%2B-%2BYaST%2BGuys%2B1.JPG" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>YaST guys discussing the idea</i></td></tr>
</tbody></table>
<div>
<span style="background-color: rgba(246 , 246 , 246 , 0.701961); color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px; line-height: 20px;">Ladislav came with an idea to have a <a href="https://en.wikipedia.org/wiki/WYSIWYG" target="_blank">WYSIVYG</a> editor for YaST dialogs. Right now, you have to design a dialog, write an exact definition of the dialog in the code and then run it to see the result. His project enables everyone to change a dialog on-the-fly directly in a running YaST. You can already open the editor, delete some widgets or edit their properties. See more at <a href="https://hackweek.suse.com/14/projects/1522" target="_blank">the project</a> itself.</span></div>
<div>
<span style="background-color: rgba(246 , 246 , 246 , 0.701961); color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px; line-height: 20px;"><br /></span></div>
<div>
<span style="background-color: rgba(246 , 246 , 246 , 0.701961); color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px; line-height: 20px;">We were already able to open a <a href="https://en.opensuse.org/SDB:YaST_tricks#YaST_Hotkeys" target="_blank">Stylesheet Editor</a> by pressing </span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;"><span style="font-size: 14px; line-height: 20px;"><i>Ctrl-Shift-Alt-S</i> in YaST (and also the Installer) and edit the used style. Ladislav's project uses similar approach to the dialog content.</span></span></div>
<h2>
Rooms management for Janus/Jangouts using Salt</h2>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-YJKJVZWsMZc/V3EzX8ntxXI/AAAAAAAAFgQ/kT3GklQIKhU6y29kDjq7db1AaSmxw7J4QCLcB/s1600/Monday%2B-%2BJangouts.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="131" src="https://3.bp.blogspot.com/-YJKJVZWsMZc/V3EzX8ntxXI/AAAAAAAAFgQ/kT3GklQIKhU6y29kDjq7db1AaSmxw7J4QCLcB/s200/Monday%2B-%2BJangouts.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>Jangouts welcome screen</i></td></tr>
</tbody></table>
We use <a href="https://github.com/jangouts/jangouts" target="_blank">Jangouts</a> every day for our SCRUM stand-up calls, and other meetings. More and more teams at SUSE want to do the same, but the current Jangouts does not allow to create rooms as they are needed yet - an administrator has to adjust the configuration manually and reload the service.<br />
<br />
<a href="https://github.com/ancorgs" target="_blank">Ancor</a> originated the idea to <a href="https://hackweek.suse.com/14/projects/1410" target="_blank">use Salt for the Jangouts room management</a> and <a href="https://github.com/meaksh" target="_blank">Pablo</a> took it and already <a href="https://github.com/meaksh/salt-janus-module/" target="_blank">implemented a working solution</a> which talks directly to the Janus REST API.<br />
<br />
<h2>
Speeding-Up The Installer</h2>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-xQ8iG_UxDwc/V3E2alquiUI/AAAAAAAAFgg/NG5vIpdP5xkvTg1t5br62uzg9918ndMNwCLcB/s1600/Monday%2B-%2BSpeedup.jpg" imageanchor="1" style="clear: right; display: inline; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="112" src="https://4.bp.blogspot.com/-xQ8iG_UxDwc/V3E2alquiUI/AAAAAAAAFgg/NG5vIpdP5xkvTg1t5br62uzg9918ndMNwCLcB/s200/Monday%2B-%2BSpeedup.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">13 seconds faster!</td></tr>
</tbody></table>
We have been using <a href="http://os-autoinst.github.io/openQA/" target="_blank">openQA</a> for continuous integration testing for quite some time and we are writing more and more tests. This means that we have to run them, but as time is actually limited, every second counts. Especially the saved one and even more if you multiply the result by several hundreds (tests per week). Moreover, this should lead into saving resources and being greener at the end.<br />
<br />
Josef has decided to <a href="https://hackweek.suse.com/14/projects/1728" target="_blank">speed-up the installer</a> by not doing things that are not necessary. He already succeeded in saving 13 seconds (from 58 seconds down to 45) while writing and adjusting the bootloader settings (<a href="https://github.com/yast/yast-installation/pull/398" target="_blank">here</a> and <a href="https://github.com/yast/yast-kdump/pull/61" target="_blank">here</a>).<br />
<br />
Stay tuned for the update! Or <a href="https://hackweek.suse.com/14/projects" target="_blank">contribute</a> to our projects :)Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com1tag:blogger.com,1999:blog-503489719545585206.post-65284632283711290572014-09-25T13:53:00.000+02:002014-09-25T13:53:33.596+02:00Yast Code Review Guide<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-ddk3gH3_KPU/VCP_fuKi_wI/AAAAAAAAEwM/4GcTJpTO8iA/s1600/PR.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-ddk3gH3_KPU/VCP_fuKi_wI/AAAAAAAAEwM/4GcTJpTO8iA/s1600/PR.JPG" /></a></div>
Yast team has finally published their official <b>Code Review Guide</b>.<br />
<br />
All contributors and Yast team members are asked to use the very same simple rules for all code changes related to Yast, including Installer or just simply all code handled by thee Yast team, including, e.g., Linuxrc.<br />
<br />
Please, see the <a href="https://github.com/yast/yast.github.io/blob/master/doc/code-review.md" target="_blank">guide here</a>. We are looking forward your suggestions for improvements.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-17090561692977838242014-04-10T11:49:00.000+02:002014-04-10T11:50:08.008+02:00We are hiring: Yast Developer<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-VMboENdrQ-k/U0Zja6jyQOI/AAAAAAAAEEI/iWuB7kCSaPA/s1600/Geeko-button.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-VMboENdrQ-k/U0Zja6jyQOI/AAAAAAAAEEI/iWuB7kCSaPA/s1600/Geeko-button.png" /></a></div>
Do you love writing elegant and well-understandable code in <b>Ruby</b>? Do you want to do something new that really matters to thousands of people? Do you want to create <b>open-source</b> as your daily job and make <b>openSUSE</b> better? Join us and become a full-time <b>Yast</b> <b>developer</b>!<br />
<br />
Yast team is looking for a new "Yastie". Job description can be found here at <a href="https://attachmatehr.silkroad.com/epostings/index.cfm?fuseaction=app.jobinfo&jobid=306245&company_id=15495&version=6&source=ONLINE&jobOwner=1013811&aid=1" target="_blank">SUSE Careers</a> page.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-52996906293302037342013-09-10T15:31:00.000+02:002013-09-10T16:09:37.876+02:00YastTeam@Freenode<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-2-MVA49HM6g/Ui8bXvj_5qI/AAAAAAAADRc/Gd3gwB1-SAo/s1600/YastCartoon.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="184" src="http://2.bp.blogspot.com/-2-MVA49HM6g/Ui8bXvj_5qI/AAAAAAAADRc/Gd3gwB1-SAo/s200/YastCartoon.png" width="200" /></a></div>
After moving all the code to GitHub and translating YCP to Ruby, we, Yast team, have decided we would like to open the Yast development even more. We've found out that we should be easily reachable by the community online. That's why we've made a decision to go where the community already is and move our communication to IRC at Freenode.<br />
<br />
Find us at <a href="irc://chat.freenode.net/#yast" target="_blank"><b>irc://irc.freenode.net</b> channel <b>#yast</b></a><br />
<b><br /></b>
Come and see the real life of Yast developers! Share your thoughts with us! Test and try the Yast's sharpest edge! See you there! :)Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com2tag:blogger.com,1999:blog-503489719545585206.post-11829569015200935232013-08-15T16:28:00.001+02:002013-08-15T16:29:34.785+02:00Yast Modules: Summer Sale!<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-aN85hLqoyCY/Ugzjyg6IhlI/AAAAAAAADPw/IiL6CO_6mCw/s1600/summer-sale.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="http://2.bp.blogspot.com/-aN85hLqoyCY/Ugzjyg6IhlI/AAAAAAAADPw/IiL6CO_6mCw/s200/summer-sale.jpg" width="200" /></a></div>
Get rich and famous: Yast Team is offering some configuration modules for SALE now! ;) It doesn't hurt if you are rich or famous already.<br />
<br />
After successful conversion from YCP to Ruby, we have decided to offer some of the Yast configuration modules ownership to the community:<br />
<br />
<ul>
<li>DSL</li>
<li>ISDN</li>
<li>Modem</li>
<li>Fingerprint Reader</li>
<li>Mouse</li>
<li>Phone-Services</li>
<li>Repair</li>
<li>AutoFS</li>
<li>IrDA</li>
</ul>
<div>
More information including the current state can be found <a href="https://docs.google.com/spreadsheet/ccc?key=0AhWDup9rfv8cdE9WcjhEM0U2QjlVeFB6aG5tWUJnQnc#gid=0" target="_blank">here at this document</a>. If you are interested, just comment below this blog or contact us via yast-devel, or opensuse-factory (at opensuse.org) mailing lists.</div>
Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-18289711752895964122013-07-31T16:59:00.000+02:002013-07-31T16:59:09.173+02:00YaST Says: Hello, Ruby!<div class="tr_bq">
... and good bye, YCP! :)</div>
<br />
All YaST modules have been just automatically converted from YCP programming language to Ruby. Transition has been done using special tool called <a href="https://github.com/yast/ycp-killer" target="_blank">YCP-Killer</a> developed in SUSE. See the announcement at <a href="http://lists.opensuse.org/yast-devel/2013-07/msg00247.html" target="_blank">yast-devel</a> mailing-list.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-C8_4VIx6s-c/UfkiWc41F1I/AAAAAAAADPY/DWELDdLI4v0/s1600/YastInRuby.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="261" src="http://4.bp.blogspot.com/-C8_4VIx6s-c/UfkiWc41F1I/AAAAAAAADPY/DWELDdLI4v0/s320/YastInRuby.png" width="320" /></a></div>
Many thanks to the team, especially David Majda, Josef Reidinger, Ladislav Slezak, Jiri Suchomel, Vladimir Moravec, Martin Vidner, and many others testing and checking the converted code, and providing feedback and other good ideas.<br />
<br />
All modules have been already submitted to <a href="https://build.opensuse.org/project/show/YaST:Head" target="_blank">YaST:Head</a> in OBS and packages already are or will be available shortly in its <a href="https://build.opensuse.org/project/repositories/YaST:Head" target="_blank">download repository</a>. All packages converted to Ruby are available in version 3.0.0 or higher.<br />
<br />
Here is how you can upgrade your YaST packages in openSUSE 12.3:<br />
<blockquote>
zypper ar -f http://download.opensuse.org/repositories/YaST:/Head/openSUSE_12.3/<br />YaST:Head<br /> zypper dup --from YaST:Head</blockquote>
You actually might need to wait a few minutes or hours before 12.3 build is finished. Factory should be ready by now.<br />
<br />
See you soon at <a href="https://github.com/yast" target="_blank">GitHub/yast</a>!Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-71363381770075988092013-07-02T13:27:00.002+02:002013-07-02T13:27:52.545+02:00Easy-to-try Appliance with Yast Services Manager written in RubyLast week I've blogged about <i>Yast Services-Manager</i> - future replacement for <i>YaST Runlevel</i>, tool for managing <i>systemd</i> written in Ruby. We had some issues with using the newly developed code on openSUSE 12.3 as the code is planned for openSUSE 13.1 and further. It usually dragged in several new dependencies and they sometimes were not built properly.<br />
<br />
To make trying and testing easier for you, I've created an appliance <a href="http://susestudio.com/a/WynL1L/yast-in-ruby-yast-head" target="_blank"><b>Yast in Ruby</b></a> based on <a href="https://build.opensuse.org/project/show?project=YaST%3AHead" target="_blank">YaST:Head</a> project built for openSUSE 12.3 target in Open Build Service. Only <i>root</i> user with password <i>linux</i> is there.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-n_t9j6nzQxQ/UdK0HrttCkI/AAAAAAAADOo/jKLmXPbA4RM/s832/YaSTServicesManager-ApplianceinTestdrive.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="http://2.bp.blogspot.com/-n_t9j6nzQxQ/UdK0HrttCkI/AAAAAAAADOo/jKLmXPbA4RM/s320/YaSTServicesManager-ApplianceinTestdrive.png" width="320" /></a></div>
<br />
Above, you can see screenshot from this appliance running in SUSE Studio TestDrive. Appliance is currently built for VirutalBox/VMware.<br />
<br />
If you now want to see or try to edit source files, they are just a few of them:<br />
<blockquote class="tr_bq">
#> rpm -ql yast2-services-manager<br />/usr/share/YaST2/clients/services-manager.rb<br />/usr/share/YaST2/modules/systemd_service.rb<br />/usr/share/YaST2/modules/systemd_target.rb<br />/usr/share/applications/YaST2/services-manager.desktop</blockquote>
After you edit these files, you don't need to compile anything. Ruby is a scripting programming language so it works as-is. Logs can be found at <i>/var/log/YaST2/y2log</i>.<br />
<br />
I hope it's going to be useful for you!Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-32301082948767001662013-06-26T15:48:00.000+02:002013-06-26T15:48:02.894+02:00Non-YaST Applications Can Benefit from YaST FrameworkAs you already know, YaST team has been working on an automatic translation of the YaST code from YCP to Ruby. This is possible thanks to two projects<br />
<br />
<ul>
<li><a href="https://github.com/yast/y2r" target="_blank">y2r</a> - translates YCP code into Ruby</li>
<li><a href="https://github.com/yast/ycp-killer" target="_blank">ycp-killer</a> - manages tasks related to translation of YCP code in YaST modules into Ruby</li>
</ul>
<h2>
Y2R Editor</h2>
I've been asked by the team to write a simple application allowing writing <i>YCP</i> code that would be automatically translated to <i>Ruby</i> and shown aside. Creating this application using YaST framework was the very next logical step. Development was fast and easy and it has proven that we can use that framework for system applications as well.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-a0KHm5CNnI8/UcrjquEi3dI/AAAAAAAADLc/I9MUtiLPq9U/s1600/Y2REditor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="175" src="http://2.bp.blogspot.com/-a0KHm5CNnI8/UcrjquEi3dI/AAAAAAAADLc/I9MUtiLPq9U/s320/Y2REditor.png" width="320" /></a></div>
<br />
The whole <a href="https://github.com/yast/y2r-tools/blob/master/src/clients/y2r-editor.rb" target="_blank">source code</a> is written in Ruby and it's connected to the YaST framework via <a href="https://github.com/yast/yast-ruby-bindings" target="_blank">yast2-ruby-bindings</a> (version >= 1.0.0).<br />
<h2>
How to Run the Editor</h2>
If you want to try running the editor yourself, follow the <i>README.md</i> file in <a href="https://github.com/yast/y2r-tools" target="_blank">y2r-tools</a> project. You will need to have <a href="https://github.com/yast/y2r" target="_blank">y2r project</a> cloned to your system and it's also helpful to have to latest <i>yast2-core</i> from <a href="https://build.opensuse.org/project/show?project=YaST%3AHead" target="_blank">YaST:Head</a> project, because part of it is used for the translation.<br />
<br />
Note: Just in case it will stuck in the middle of the translation, search for <i>ruby</i> process and kill it (<i>kill -9 $PROCESS_ID</i>). Then write the second quote, please :) Yes, there was a bug in <i>yast2-core</i> that it was searching for closing quote in strings like <i>string message = "Unfinished</i>.<br />
<h2>
YaST Framework</h2>
<div>
Applications written using YaST framework can benefit from several features:</div>
<div>
<ul>
<li><a href="https://github.com/libyui/libyui" target="_blank">UI support</a> for ncurses, Qt, and GTK (as plug-ins) just by writing one single UI definition</li>
<li>Possibility to use <a href="http://doc.opensuse.org/projects/YaST/openSUSE11.3/modules/index.html" target="_blank">YaST libraries</a> (even those still written in YCP)</li>
<li>Possibility to use any Ruby library or Gem, such as <a href="https://github.com/openSUSE/cheetah" target="_blank">Cheetah</a> in this case</li>
<li><a href="http://doc.opensuse.org/projects/YaST/openSUSE11.3/scr/index.html" target="_blank">SCR</a> - Layer for accessing the system configuration (read, write, execute)</li>
</ul>
Everything is at <a href="https://github.com/" target="_blank">GitHub</a>. Try it, and tell us what can be enhanced and how!</div>
Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-70384231748017522652013-06-25T14:57:00.000+02:002013-06-25T14:57:46.521+02:00YaST Runlevel is dead, long live YaST Services Manager!<h2>
Long Story Short</h2>
It's a public secret that YaST Runlevel in openSUSE 12.3 is far to be useful. It's caused by switching from <i>SysV</i> to <i>systemd</i> whereas all the UI and internal functionality has been designed for <i>SysV</i>. I was thinking about the possibility to rewrite the current module to use systemd directly, but then I realized that I should rather start a pilot project from scratch: The very first YaST module written completely in <i>Ruby</i>!<br />
<h2>
New YaST Module</h2>
This new YaST module has been called <b>Services Manager</b> (yast2-services-manager) to better reflect what it actually does. You can find its <b>source code <a href="https://github.com/kobliha/yast-services-manager" target="_blank">here</a></b>. And you can download the <b>package <a href="https://build.opensuse.org/project/repositories?project=YaST%3AHead" target="_blank">here</a></b>. It will additionally need <i>yast2-ruby-bindings</i> package in version <i>1.0.0</i> or higher which is available in the same repository. To start the module, just type <i>yast2 services-manager</i> as root or start it from <i>YaST Control Center</i>.<br />
<h2>
Screenshots</h2>
<div>
Base dialog of the module. Simply start/stop or enable/disable services ...</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Gt5qX2YQIXM/UcmNY0nK-rI/AAAAAAAADLI/S9sVgNwFFxc/s1600/YSM_BaseDialog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="221" src="http://1.bp.blogspot.com/-Gt5qX2YQIXM/UcmNY0nK-rI/AAAAAAAADLI/S9sVgNwFFxc/s320/YSM_BaseDialog.png" width="320" /></a></div>
... or set the default target (used to be called default runlevel) ...<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-bnSO0mLur4E/UcmNY1a3jpI/AAAAAAAADLE/H3l164fnGkU/s1600/YSM_DefaultSystemTarget.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="221" src="http://4.bp.blogspot.com/-bnSO0mLur4E/UcmNY1a3jpI/AAAAAAAADLE/H3l164fnGkU/s320/YSM_DefaultSystemTarget.png" width="320" /></a></div>
... or see the service details<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-2arDpIG1lIc/UcmNY4DoIGI/AAAAAAAADK8/7ajWS5kinX0/s1600/YSM_Details.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="221" src="http://1.bp.blogspot.com/-2arDpIG1lIc/UcmNY4DoIGI/AAAAAAAADK8/7ajWS5kinX0/s320/YSM_Details.png" width="320" /></a></div>
<h2>
Why in Ruby</h2>
All old YaST modules were written in YCP - special language invented just for YaST, but there are other programming languages that can be used now and Ruby is THE programming language used for automatic <a href="http://lists.opensuse.org/yast-devel/2013-05/msg00035.html" target="_blank">translation from YCP</a>.<br />
<br />
Ruby gives us much more than YCP<br />
<br />
<ul>
<li>Developers don't need to learn another language just for YaST</li>
<li>There are already many libraries out there</li>
<li>We can use several great <a href="https://github.com/kobliha/yast-services-manager/blob/master/test/unit/system_target.rb" target="_blank">testing frameworks</a> that already exist</li>
<li>And last but not least: It's a very nice and powerful language</li>
</ul>
I hope you'll like it too :)Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com17tag:blogger.com,1999:blog-503489719545585206.post-9819549057159941292012-10-19T11:52:00.000+02:002012-10-19T13:55:07.490+02:00Android Application for openSUSE Conference<a href="http://2.bp.blogspot.com/-4W4yZmXqPnE/UIEarVGudEI/AAAAAAAACzI/gMSL6uvVsRo/s1600/SUSEConferencesLogo.png" imageanchor="1" style="float: left; margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-4W4yZmXqPnE/UIEarVGudEI/AAAAAAAACzI/gMSL6uvVsRo/s1600/SUSEConferencesLogo.png" /></a>Thanks to <a href="http://en.opensuse.org/User:Mbarringer" target="_blank">Matt Barringer</a>, we now have an Android application for showing the openSUSE Conference schedule, details about talks and presentations and also some information about the presenters.<br />
<br />
The application can be found at <a href="https://play.google.com/" target="_blank">Google Play Store</a> under name <b><a href="https://play.google.com/store/apps/details?id=de.incoherent.suseconferenceclient&feature=search_result#?t=W251bGwsMSwxLDEsImRlLmluY29oZXJlbnQuc3VzZWNvbmZlcmVuY2VjbGllbnQiXQ.." target="_blank">SUSE Conferences</a></b> and it's, of course, for free. It uses internet connection for downloading the data - there will be wireless network at the site, <i>SSID Conference</i> (get the details during registration/getting your badge).<br />
<br />
When you start the application, you can select the conference schedule you are interested in. There are these two conferences now:<br />
<ul>
<li>Bootstrapping Awesome - 2012</li>
<li>openSUSE Summit - 2012</li>
</ul>
Make sure you select the <b>Bootstrapping Awesome</b>.<br />
<br />
<table cellspacing=10>
<tbody>
<tr>
<td valign="bottom"><i>Selecting the conference: </i><br />
<div class="separator" style="clear: both; text-align: left;">
<a href="http://3.bp.blogspot.com/-azaeFBAG2gc/UIEde45B73I/AAAAAAAACzY/8zNnjc2cT-0/s1600/2012-10-19+11.06.42.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-azaeFBAG2gc/UIEde45B73I/AAAAAAAACzY/8zNnjc2cT-0/s320/2012-10-19+11.06.42.jpg" width="192" /> </a></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
</td>
<td valign="bottom"><i>Conference schedule, click on a talk to get more details:</i>
<div class="separator" style="clear: both; text-align: left;">
<a href="http://1.bp.blogspot.com/-sh9TiwsnoHE/UIEdjTpxZLI/AAAAAAAACzg/0kpHc9yafmc/s1600/2012-10-19+11.07.56.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-sh9TiwsnoHE/UIEdjTpxZLI/AAAAAAAACzg/0kpHc9yafmc/s320/2012-10-19+11.07.56.jpg" width="192" /> </a></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
</td>
</tr>
<tr>
<td valign="bottom"><i>Details for a selected talk, click on the gray star to add it to your personal schedule (turns to yellow):</i><br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="http://3.bp.blogspot.com/-dXdCoyE57ck/UIEdqEOLwtI/AAAAAAAACzo/1_xtbbnqNKU/s1600/2012-10-19+11.08.33.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-dXdCoyE57ck/UIEdqEOLwtI/AAAAAAAACzo/1_xtbbnqNKU/s320/2012-10-19+11.08.33.jpg" width="192" /></a></div>
</td>
<td valign="bottom"><i>Talk added to your personal schedule, you still have some time left for more talks :)</i><br />
<div class="separator" style="clear: both; text-align: left;">
<a href="http://2.bp.blogspot.com/-n5HIoX07xzU/UIEdr0f4RhI/AAAAAAAACzw/Qjc_RB76tAA/s1600/2012-10-19+11.08.56.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-n5HIoX07xzU/UIEdr0f4RhI/AAAAAAAACzw/Qjc_RB76tAA/s320/2012-10-19+11.08.56.jpg" width="192" /></a></div>
</td>
</tr>
<tr>
<td valign="bottom"><i>Currently downloaded news:</i><br />
<div class="separator" style="clear: both; text-align: left;">
<a href="http://3.bp.blogspot.com/-LmqDIu4pmjk/UIEdsrble3I/AAAAAAAACz4/nDsVXH-s2Ik/s1600/2012-10-19+11.11.02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-LmqDIu4pmjk/UIEdsrble3I/AAAAAAAACz4/nDsVXH-s2Ik/s320/2012-10-19+11.11.02.jpg" width="192" /></a></div>
</td>
<td> </td>
</tr>
</tbody>
</table>
Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0Thákurova 532/6, 160 00 Prague 6-Dejvice, Czech Republic50.105194067933155 14.38971877098083550.104557567933156 14.388484770980835 50.105830567933154 14.390952770980835tag:blogger.com,1999:blog-503489719545585206.post-88361842638399720972012-05-21T15:14:00.001+02:002012-05-21T15:14:33.412+02:00YaST Development Has Been Moved to GitHub<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-xsh-t0RZICk/T7o74fB9LvI/AAAAAAAAB-8/umC9kss8wUs/s1600/YaSTatGitHub.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://1.bp.blogspot.com/-xsh-t0RZICk/T7o74fB9LvI/AAAAAAAAB-8/umC9kss8wUs/s1600/YaSTatGitHub.JPG" /></a></div>
<b>YaST</b> Development has been finally <b>moved to GitHub</b> to this URL <a href="https://github.com/yast">https://github.com/yast</a><br />
See also this <a href="http://lists.opensuse.org/yast-devel/2012-05/msg00049.html" target="_blank">announcement</a>.<br />
<br />
Contributing to YaST has never been <a href="http://help.github.com/fork-a-repo/" target="_blank">easier</a>: Fork for the repository, play with the code, commit it and make a pull request. Meet the YaST guys at irc.freenode.net #yast<br />
<br />
Many thanks to the SUSE Systems Management team, and especially to <i>Jens Daniel Schmidt</i> and <i>Bernhard Wiedemann</i>!Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-15045700444618634532012-05-16T15:56:00.000+02:002012-05-16T15:56:27.896+02:00YaST is Moving to GitHub<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-iaQbet5MNPU/T7OsdHuXuKI/AAAAAAAAB5k/hGU5LPU-MT0/s1600/GitHub_social.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://4.bp.blogspot.com/-iaQbet5MNPU/T7OsdHuXuKI/AAAAAAAAB5k/hGU5LPU-MT0/s1600/GitHub_social.png" /></a></div>
The SUSE Systems Management team has finished converting <a href="http://en.opensuse.org/Portal:YaST" target="_blank">YaST</a> from <a href="http://svn.opensuse.org/svn/yast/" target="_blank">Subversion</a> to GIT and will be migrating all repositories to <a href="https://github.com/" target="_blank">GitHub</a> this week.<br />
<br />
We'd like to benefit from some GitHub features, such as code review, comments, easier merging and cherry-picking, integrated wiki etc., but most of all, we'd like to be closer to the community so it's easier for you to change anything in YaST.<br />
<br />
See you soon at <a href="https://github.com/" target="_blank">GitHub</a>!Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-86897891429901356382012-04-25T17:10:00.000+02:002012-05-02T18:07:19.461+02:00SUSE is Looking for Designers and Web Developers<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-yID1fmwHRIk/T6Fbql_rIHI/AAAAAAAABjA/6ZHx_J334xQ/s1600/hiring.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://4.bp.blogspot.com/-yID1fmwHRIk/T6Fbql_rIHI/AAAAAAAABjA/6ZHx_J334xQ/s1600/hiring.png" /></a></div>
<a href="http://susestudio.com/" target="_blank">SUSE Studio</a> and Systems Management teams are looking for designers and web-developers!<br />
<br />
You've always loved SUSE and wanted to join the team? You can do it now. There are several positions open at the SUSE <a href="http://www.suse.com/company/careers/" target="_blank">careers page</a>.<br />
<br />
<ul>
<li><a href="http://bit.ly/K4wUos" target="_blank">User Interface Designer</a></li>
<li><a href="http://bit.ly/IIA7v2" target="_blank">Front-End Web Developer</a></li>
<li><a href="http://bit.ly/JAij9w" target="_blank">Web Designer openSUSE Boosters</a></li>
<li>and <a href="http://www.suse.com/company/careers/" target="_blank">more...</a></li>
</ul>
<br />
Learn more about SUSE Studio positions also <a href="http://bit.ly/Ibfiw8" target="_blank">here</a>.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-30237661465474889422012-04-03T17:26:00.001+02:002012-04-03T17:37:55.130+02:00Puppet Ruby DSL using Gloves Library on openSUSE 12.1<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/--t1uZfnjJ80/T3sZR_nIHAI/AAAAAAAABio/vMRiUdy9CbE/s1600/Opensuse_8.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://4.bp.blogspot.com/--t1uZfnjJ80/T3sZR_nIHAI/AAAAAAAABio/vMRiUdy9CbE/s1600/Opensuse_8.jpg" /></a></div>
<h2>
Motivation</h2>
I've published two articles recently: <a href="http://kobliha-suse.blogspot.com/2012/03/gloves-systems-management-library-aka.html" target="_blank">How to use Gloves on Ubuntu</a> and <a href="http://kobliha-suse.blogspot.com/2012/03/mass-management-configuration-tool.html" target="_blank">How to use Puppet on openSUSE 12.1</a>. I wanted to connect these two into Using <a href="https://github.com/yast/yast--" target="_blank">Gloves</a> (formerly YaST++) on openSUSE via <a href="http://docs.puppetlabs.com/" target="_blank">Puppet</a>. And because Gloves library is written in Ruby, it could also use <a href="http://projects.puppetlabs.com/projects/1/wiki/Ruby_Dsl" target="_blank">Ruby DSL</a>.<br />
<br />
This example will show how to download Gloves from GitHub, install it to the system and use it to open a special port in SuSEfirewall2.<br />
<h2>
What You Might Need</h2>
<div>
<ul>
<li>One server with openSUSE 12.1 (could be virtual), AKA server.example.com hostname in this example</li>
<li>One or more clients with openSUSE 12.1 (could be virtual), using client.example.com hostname</li>
</ul>
I've created a small appliance for client <a href="http://susestudio.com/a/MOY4sx/gloves-sdk-with-pupet" target="_blank">available in SUSE Gallery</a> that should save you some time if you want to try yourself (<i>root</i> password is <i>linux</i>).</div>
<h2>
Configuring a Puppet Server</h2>
Let's assume you already have a Puppet server installed and configured. If you don't, follow section <i>Configuring a Puppet Server</i> in <a href="http://kobliha-suse.blogspot.com/2012/03/mass-management-configuration-tool.html" target="_blank">this blog</a>.<br />
<br />
<ul>
<li>Now we'll create the recipe in Ruby: <span class="Apple-style-span" style="background-color: #cccccc;"> touch /etc/puppet/manifests/site.rb </span></li>
<li>And use it from Puppet by adding manifest = /etc/puppet/manifests/site.rb into your /etc/puppet/puppet.conf</li>
<li>Restart the Puppet server: <span class="Apple-style-span" style="background-color: #cccccc;"> rcpuppetmasterd restart </span></li>
</ul>
<h3>
<a href="http://www.prlog.org/10600764-puppet-labs-logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="93" src="http://www.prlog.org/10600764-puppet-labs-logo.png" width="200" /></a>Recipe Written in Ruby DSL</h3>
<div style="background-color: white;">
Edit your /etc/puppet/manifests/site.rb to contain these definitions, they will be explained later:</div>
<div style="background-color: white;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><br /></span></div>
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;">hostclass :SuSEfirewall2 do</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> # Installs requred packages</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> package :ntp, :ensure => :installed</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> package :'rubygem-rake', :ensure => :installed</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> package :'rubygem-packaging_rake_tasks', :ensure => :installed</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> package :git, :ensure => :installed</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> # Fetch from git</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> create_resource :exec,</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> 'sources_from_git',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :require => 'Package[git]',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :cwd => '/tmp',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :command => '/usr/bin/git clone git://github.com/yast/yast--.git'</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> # Install from git</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> create_resource :exec,</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> 'install_from_sources',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :require => 'Exec[sources_from_git]',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :cwd => '/tmp/yast--',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :command => '/usr/bin/rake install'</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> # Removest the git repository</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> create_resource :exec,</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> 'remove_sources',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :require => 'Exec[install_from_sources]',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :cwd => '/tmp/',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :command => '/bin/rm -rf yast--'</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> # Creates file with configuration commands (Ruby)</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> # Later a command-line interface would be better</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> # Yes, I know there's a security risk, don't use this in production!</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> file '/tmp/open_port_in_firewall',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :require => 'Exec[sources_from_git]',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :content => "</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> require 'y_lib/susefirewall2'</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> YLib::Susefirewall2::add({},</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> {'kind' => 'open_port', 'port' => 'port_opened_by_Gloves',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> 'zone' => 'EXT'})\n"</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> # Calls the file with commands (Ruby)</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> create_resource :exec,</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> 'open_port_in_firewall',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :require => 'File[/tmp/open_port_in_firewall]',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :command => '/usr/bin/ruby /tmp/open_port_in_firewall',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :path => ['/usr/bin'],</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :notify => 'Service[SuSEfirewall2_setup]'</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> # Adjusts the SuSEfirewall2 service</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> service :SuSEfirewall2_setup,</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :start => '/sbin/rcSuSEfirewall2 start',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :restart => '/sbin/rcSuSEfirewall2 restart',</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :ensure => :running,</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :enable => :true,</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> :hasrestart => :true</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;">end</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;">node 'client.example.com' do</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> create_resource :class, :SuSEfirewall2</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;">end</span><br />
<h3>
<span class="Apple-style-span" style="font-size: 19px;">Recipe Explanation</span></h3>
<div style="background-color: white;">
There are two top-level definitions in the recipe:</div>
<div style="background-color: white;">
</div>
<ul>
<li><b>hostclass</b> defines a resource similar to <i>class</i> in Puppet DSL - usually used to describe one service to setup</li>
<li><b>node</b> definition says which <i>hostclasses</i> are used for which clients - change client.example.com into your client hostname</li>
</ul>
Let's describe the <i>SuSEfirewall2</i> hostclass in detail:<br />
<div style="background-color: white;">
</div>
<ul>
<li>The first part just installs some required packages</li>
<li>Type <b>:exec</b> calls an external command, <i>sources_from_git</i> clones the <a href="https://github.com/yast/yast--" target="_blank">Gloves</a> repository hosted at GitHub</li>
<li>Parameter <b>:require => 'Package[git]'</b> adds new dependency on package <i>git</i> - this means that cloning the repository will not start before <i>git</i> is installed</li>
<li>Parameter <b>:cwd</b> defines the working directory</li>
<li>Another <b>:exec</b> <i>install_from_sources</i> will install Gloves library from sources to the system, in fact, also <i>rubygem-packaging_rake_tasks package</i> is required for this operation</li>
<li>Another <b>:exec</b> <i>remove_sources</i> removes the cloned repository</li>
<li>The the tricky part starts here :) Puppet will create file <i>/tmp/open_port_in_firewall</i> containing a short script written in Ruby using the Gloves library:<br /><br /><span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;">require 'y_lib/susefirewall2'<br /><br />YLib::Susefirewall2::add({},<br /> {'kind' => 'open_port', 'port' => 'port_opened_by_Gloves', 'zone' => 'EXT'})</span><br /><br />This script will open port <i>port_opened_by_Gloves</i> in <i>SuSEfirewall2</i>. See <a href="https://github.com/yast/yast--/blob/master/yast%2B%2Blib-firewall/lib/y_lib/susefirewall2.rb" target="_blank">documentation</a> generated from <span class="Apple-style-span" style="background-color: white;"><a href="http://rubydoc.info/github/yast/yast--/YLib/Susefirewall2" target="_blank">YLib::Susefirewall2</a> sources. In fact, this port name actually doesn't exist in <i>/etc/services</i> but that's fine for our example. Frankly this is rather <i>a hack</i> than <i>a solution</i> - I'd like to have Gloves CLI soon.</span></li>
<li><span class="Apple-style-span" style="background-color: white;">And then we'll call the script with another <b>:exec</b> command <i>open_port_in_firewall</i>.</span></li>
<li><span class="Apple-style-span" style="background-color: white;">This definition also show another type of dependency <b>:notify => 'Service[SuSEfirewall2_setup]'</b> - after port is opened, service <i>SuSEfirewall2_setup</i> is notified to re/start.</span></li>
</ul>
<h2>
<span class="Apple-style-span" style="background-color: white;">Applying the Recipe on Your Client</span></h2>
<br />
<div>
<span class="Apple-style-span" style="background-color: white;">Follow steps written in Client Configuration section described at <a href="http://kobliha-suse.blogspot.com/2012/03/mass-management-configuration-tool.html" target="_blank">Mass Management Configuration Tool Puppet on openSUSE 12.1</a> excluding the last <i>puppetd --test</i> call. Additionally, do these changes:</span></div>
<div>
<ul>
<li>Run: <i style="background-color: #cccccc;"> zypper ar --refresh http://download.opensuse.org/repositories/devel:languages:ruby:extensions/openSUSE_12.1 devel:languages:ruby:extensions_12.1 </i> to add repository containing required Ruby libraries into your system</li>
<li>Run: <i style="background-color: #cccccc;"> zypper in rubygem-ruby-dbus rubygem-open4 rubygem-ruby-augeas rubygem-packaging_rake_tasks rubygem-rake </i> to install all the required Rubygems</li>
</ul>
Make sure that <i>server=server.example.com</i> (replace with your server hostname) is added into the <i>[main]</i> section in <i>/etc/puppet/puppet.conf</i> on your client and finally call <i style="background-color: #cccccc;"> puppetd --test --verbose </i>. It should return something similar to this output:</div>
<div>
<br /></div>
<div>
<div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">info: Creating a new SSL key for client.example.com</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">warning: peer certificate won't be verified in this SSL session</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">info: Caching certificate for ca</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">warning: peer certificate won't be verified in this SSL session</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">warning: peer certificate won't be verified in this SSL session</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">info: Creating a new SSL certificate request for client.example.com</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">info: Certificate Request fingerprint (md5): EA:C7:28:73:B4:F1:F1:59:F6:3E:3E:BB:5E:E7:BB:31</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">warning: peer certificate won't be verified in this SSL session</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">warning: peer certificate won't be verified in this SSL session</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">info: Caching certificate for client.example.com</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">info: Caching certificate_revocation_list for ca</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">info: Caching catalog for client.example.com</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<br /></div>
<div>
<span class="Apple-style-span" style="font-family: inherit;">This was the output from the initial client configuration. Continues with applying the configuration...</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<br /></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">info: Applying configuration version '1333466151'</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">notice: /Stage[main]/Susefirewall2/Package[ntp]/ensure: created</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">notice: /Stage[main]/Susefirewall2/Package[git]/ensure: created</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">notice: /Stage[main]/Susefirewall2/Exec[sources_from_git]/returns: executed successfully</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">notice: /Stage[main]/Susefirewall2/File[/tmp/open_port_in_firewall]/ensure: defined content as '{md5}3314e4c08f61e127fc3cc85170208f47'</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">notice: /Stage[main]/Susefirewall2/Exec[install_from_sources]/returns: executed successfully</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">notice: /Stage[main]/Susefirewall2/Exec[remove_sources]/returns: executed successfully</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">notice: /Stage[main]/Susefirewall2/Exec[open_port_in_firewall]/returns: executed successfully</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">info: /Stage[main]/Susefirewall2/Exec[open_port_in_firewall]: Scheduling refresh of Service[SuSEfirewall2_setup] </span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">notice: /Stage[main]/Susefirewall2/Service[SuSEfirewall2_setup]: Triggered 'refresh' from 1 events</span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">info: Creating state file /var/lib/puppet/state/state.yaml </span></div>
<div style="font-family: 'Courier New', Courier, monospace; font-size: small;">
<span class="Apple-style-span" style="background-color: #eeeeee;">notice: Finished catalog run in 27.32 seconds</span></div>
</div>
</div>
<div>
<br /></div>
<div>
I've created a backup of my SuSEfirewall2 configuration before running the <i>puppetd</i> command so I can check the changes now:</div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><br /></span></div>
<div>
<span class="Apple-style-span" style="background-color: #cccccc;"><i> diff -u /etc/sysconfig/SuSEfirewall2.backup /etc/sysconfig/SuSEfirewall2 </i></span><span class="Apple-style-span" style="background-color: white;"> shows:</span></div>
<div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><br /></span></span></div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">--- /etc/sysconfig/SuSEfirewall2.backup</span></span></div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">+++ /etc/sysconfig/SuSEfirewall2</span></span></div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">@@ -281,7 +281,7 @@</span></span></div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> #</span></span></div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> # Examples: "ssh", "123 514", "3200:3299", "ftp 22 telnet 512:514"</span></span></div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> #</span></span></div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">-FW_SERVICES_EXT_TCP="22 80 443"</span></span></div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">+FW_SERVICES_EXT_TCP="22 80 443 port_opened_by_Gloves"</span></span></div>
</div>
<div>
<br /></div>
<div>
Port <i>port_opened_by_Gloves</i> was indeed added. We can also check that the service was restarted: <i style="background-color: #cccccc;"> tail -n 200 /var/log/messages | grep port_opened_by_Gloves </i> shows:</div>
<div>
<br /></div>
<div>
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">SuSEfirewall2_setup[15588]: Loading firewall rules iptables-batch v1.4.12.1: invalid port/service `port_opened_by_Gloves' specified</span></span></div>
<div>
<br /></div>
<div>
As the port name is unknown, <i>SuSEfirewall2</i> reports this error during restart.</div>
<h2>
Where to Go Next?</h2>
<div>
Although <a href="http://projects.puppetlabs.com/projects/1/wiki/Ruby_Dsl" target="_blank">Puppet’s Ruby DSL</a> doesn't describe all the possibilities, it's still a nice intro. Blog article about <a href="http://puppetlabs.com/blog/ruby-dsl/" target="_blank">Ruby DSL</a> reveals some more details. <a href="http://projects.puppetlabs.com/projects/1/wiki/Advanced_Puppet_Pattern" target="_blank">A More Advanced Puppet Pattern</a> informs about splitting the Puppet recipe into several files.</div>Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-90999775621410020912012-03-30T10:53:00.000+02:002012-03-30T16:30:15.517+02:00Mass Management Configuration Tool Puppet on openSUSE 12.1<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.prlog.org/10600764-puppet-labs-logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="93" src="http://www.prlog.org/10600764-puppet-labs-logo.png" width="200" /></a></div>
<h2>
What is "Puppet"?</h2>
<a href="http://docs.puppetlabs.com/" target="_blank">Puppet</a> is one of the open-source solutions for mass-management configuration with centralized storage of recipes. <a href="http://projects.puppetlabs.com/projects/puppet/wiki/Patterns" target="_blank">Recipes</a> describe the resulting state of a specific system including how to get to that state, e.g., by installing packages, running scripts, enabling services, uploading whole files with configuration, etc.<br />
<h2>
This Example</h2>
I'll describe a simple example how adjust an <i><a href="http://en.wikipedia.org/wiki/Network_Time_Protocol" target="_blank">NTP</a></i> client to use <i>pool.ntp.org</i> for time synchronization including the Puppet server configuration.<br />
<h3>
Ingredients</h3>
<ul>
<li>One system acting as a <i>server</i> with <i>openSUSE 12.1</i> (can be virtual), e.g., <i>server.example.com</i></li>
<li>One or more systems acting as <i>clients</i> with <i>openSUSE 12.1</i> (can be virtual), e.g., <i>client.example.com</i></li>
<li>Text-file editor</li>
<li>Package <i>zypper</i> installed on server and client(s) - it's usually installed by default anyway</li>
<li>Patience :) The actual amount depends on the current level of sunspots visible</li>
</ul>
<br />
<b>Preparation time:</b> depends on how much you want to play with a recipe.<br />
<b>Cook time:</b> several seconds<br />
<b>Important:</b> before configuring both server and client, make sure that they have approximately the same date and time set (commands: <i>date</i>, <i>date -s YYYY-MM-DD</i>; <i>date -s HH:MM:SS</i>) otherwise you might hit some certificate issues<br />
<h2>
Configuring a Puppet Server</h2>
In this section, we'll install the needed server software, configure firewall, configure and start Puppet server.<br />
<br />
Log into the server and do these changes:<br />
<ul>
<li>Run: <i><span class="Apple-style-span" style="background-color: #cccccc;"> zypper in puppet-server yast2-firewall </span> </i># to install all required packages</li>
<li>Run: <span class="Apple-style-span" style="background-color: #cccccc;"> <i>yast2 firewall services add service=service:puppetmasterd zone=EXT </i></span> # to open needed port in firewall</li>
<li>Run: <span class="Apple-style-span" style="background-color: #cccccc;"> mkdir -pv /var/lock/subsys/ </span> # to workaround a bug in Puppet package</li>
<li>Add <i>client.example.com</i> or even <i>*.example.com</i> to <i>/etc/puppet/autosign.conf</i> # to workaround a bug in Puppet</li>
<li>Start Puppet server: <span class="Apple-style-span" style="background-color: #cccccc;"> <i>rcpuppetmasterd start </i></span></li>
<li>Enable Puppet server during boot process: <span class="Apple-style-span" style="background-color: #cccccc;"> <i>insserv puppetmasterd </i></span></li>
</ul>
Bugs mentioned above might not actually be real bugs but I've done these steps to make my life easier. These were not reported yet.<br />
<h2>
Client Configuration</h2>
Now, we'll configure a client machine to have all the required packages installed and to use the correct Puppet server.<br />
<ul>
<li>Run: <i style="background-color: #cccccc;"> zypper patch </i> # to install the latest updates - especially patch for <i>systemd</i> package</li>
<li>Run: <i style="background-color: #cccccc;"> zypper in puppet rubygems </i><span class="Apple-style-span" style="background-color: white;"> # to install all required packages</span></li>
<li>Add <i>server=server.example.com</i> into the <i>[main]</i> section in <i>/etc/puppet/puppet.conf</i> if your server name is not <i>puppet.example.com</i> - then it would work without entering this line</li>
<li>Run: <span class="Apple-style-span" style="background-color: #cccccc;"> <i>mkdir -pv /var/lock/subsys/</i> </span> # to workaround a bug in Puppet</li>
<li>Start Puppet client service: <span class="Apple-style-span" style="background-color: #cccccc;"> <i>rcpuppet start</i> </span></li>
<li>Enable Puppet client during boot process: <span class="Apple-style-span" style="background-color: #cccccc;"> <i>insserv puppet</i> </span></li>
</ul>
Let's check the the connection to server. Run <span class="Apple-style-span" style="background-color: #cccccc;"> <i>puppetd --test</i> </span> that will contact the Puppet server and try to get recipes for your client.<br />
<h2>
Creating a Recipe on the Server</h2>
Create a recipe on the server for your <i>client.example.com</i> in <i>/etc/puppet/manifests/site.pp</i> containing:<br />
<br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> class ntp {</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>package { 'ntp': ensure => installed }</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>package { 'grep': ensure => installed }</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>package { 'coreutils': ensure => installed }</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small; white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small; white-space: pre;"> </span><span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;">exec { 'add_ntp_server':</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> subscribe => Package['ntp'],</span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>command => 'echo "server <i>pool.ntp.org</i>" >> /etc/ntp.conf',</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>path => '/sbin:/usr/bin:/bin:/usr/sbin',</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>logoutput => 'on_failure',</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>unless => 'grep --quiet "^server <i>pool.ntp.org</i>$" /etc/ntp.conf',</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span></span><br />
<span class="Apple-tab-span" style="background-color: #eeeeee; white-space: pre;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>service { 'ntp':</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> subscribe => Exec['add_ntp_server'],</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>ensure => running,</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>enable => true,</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>hasrestart => true,</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> }</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> node 'client.example.com' {</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>include ntp</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> }</span></span><br />
<br />
All the sections are quite self-descriptive, anyway...<br />
<ul>
<li><b>ntp class</b> is a simple service definition that describes required packages, service configuration and service handling</li>
<li><b><a href="http://docs.puppetlabs.com/references/latest/type.html#package" target="_blank">package</a></b> type makes sure the required package gets installed - some packages might be required by <b>exec</b> later</li>
<li><b><a href="http://docs.puppetlabs.com/references/latest/type.html#exec" target="_blank">exec</a></b> runs a script under some specific conditions (onlyif, unless), here it would maybe make sense to use <a href="http://docs.puppetlabs.com/references/latest/type.html#augeas" target="_blank"><b>augeas</b></a> instead</li>
<li><b>node</b> defines which classes should be applied to a particular system</li>
</ul>
<h2>
Applying a Recipe on the Client</h2>
Simply run <span class="Apple-style-span" style="background-color: #cccccc;"> </span><i style="background-color: #cccccc;">puppetd --test</i><span class="Apple-style-span" style="background-color: #cccccc;"> </span> to apply the configuration. You should get something similar to this:<br />
<br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">info: Caching catalog for client.example.com</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">info: Applying configuration version '1333044101'</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">notice: /Stage[main]/Ntp/Package[ntp]/ensure: created</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">info: /Stage[main]/Ntp/Package[ntp]: Scheduling refresh of Exec[add_ntp_server]</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">notice: /Stage[main]/Ntp/Exec[add_ntp_server]/returns: executed successfully</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">info: /Stage[main]/Ntp/Exec[add_ntp_server]: Scheduling refresh of Service[ntp]</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">notice: /Stage[main]/Ntp/Exec[add_ntp_server]: Triggered 'refresh' from 1 events</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">info: /Stage[main]/Ntp/Exec[add_ntp_server]: Scheduling refresh of Service[ntp]</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">notice: /Stage[main]/Ntp/Service[ntp]/ensure: ensure changed 'stopped' to 'running'</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">notice: /Stage[main]/Ntp/Service[ntp]: Triggered 'refresh' from 2 events</span></span><br />
<span class="Apple-style-span" style="background-color: #eeeeee;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">notice: Finished catalog run in 8.43 seconds</span></span><br />
<br />
Otherwise Puppet should give you enough information on what went wrong. Checking <i>/var/log/messages</i> on the client and <i>/var/log/puppet/puppet.log</i> sounds like a good idea.<br />
<h2>
Conclusion</h2>
Puppet is a powerful tool for managing large computer networks, including clouds, but there are still some glitches (at least in openSUSE packages) that need to be fixed.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-70060485638760473052012-03-28T16:41:00.001+02:002012-03-28T16:42:43.338+02:00Gloves (Systems Management Library AKA YaST++) Running on Ubuntu<h2>
About</h2>
You might have seen Jiri's blog post <a href="http://lizards.opensuse.org/2012/02/15/yast-next-step-in-system-management/" target="_blank">YaST++: next step in system management</a> already. This article describes new systems management library that could be used by YaST and WebYast in the future or by any other application that can connect to its Ruby API.<br />
<br />
Although this project is still in a research phase, we'd like to have support for other Linux distributions as well. This blog describes how to start with <a href="https://github.com/yast/yast--" target="_blank">Gloves</a> on Ubuntu.<br />
<h2>
Installing the System</h2>
If you already have Ubuntu installed, you can skip this part.<br />
<br />
<ul>
<li>Download Ubuntu Desktop 11.10 for instance from <a href="http://www.ubuntu.com/download/ubuntu/download" target="_blank">here</a></li>
<li>Install it</li>
<li>Log into the system as user</li>
<li>Install additional updates if available</li>
</ul>
<h2>
Preparing the System for Gloves</h2>
<br />
Gloves is a library written in <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a>, that uses <a href="http://augeas.net/index.html" target="_blank">Augeas</a> for parsing configuration files and <a href="http://en.wikipedia.org/wiki/D-Bus" target="_blank">D-Bus</a> for authorization if called by a non-root user. That's why Gloves need some additional libraries to be installed.<br />
<br />
<ul>
<li>Open <i>xterm</i> or any other shell and continue there...</li>
<li>Run: <i>sudo apt-get install git rake libaugeas0 libaugeas-dev rubygems libopen4-ruby libaugeas-ruby</i></li>
<li>Download the latest <i>.gem</i> file from package <a href="http://bit.ly/HfBpvL" target="_blank">rubygem-packaging_rake_tasks</a> in openSUSE build service</li>
<li>Rename the downloaded gem: <i>mv packaging_rake_tasks*.gem* packaging_rake_tasks.gem</i></li>
<li>Install the downloaded .gem using: <i>sudo gem install packaging_rake_tasks.gem</i></li>
</ul>
<h2>
Gloves from the Sources</h2>
<br />
<br />
<ul>
<li>Download the sources<br />Read-only: <i>git clone https://github.com/yast/yast--.git</i><br />Or read/write: <i>git clone git@github.com:yast/yast--.git</i></li>
<li>Install the sources<br /><i>cd yast--</i><br /><i>sudo rake install</i></li>
</ul>
<h2>
Running an Example</h2>
<br />
I've tried the root access only, omitting D-Bus for now. I'd be glad if somebody tried that and written another blog post describing the required steps to make it work.<br />
<br />
<ul>
<li>sudo su</li>
<li>cd yast--</li>
<li>cd yast++lib-users/examples</li>
<li>./users_read<br />This should print a Ruby map containing all system users depending on your configuration. So, for instance something similar to this:<br /><br /><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">{...,<br /> "root"=>{"name"=>"root", "gid"=>"0", "uid"=>"0",<br /> "shell"=>"/bin/bash", "home"=>"/root", "password"=>"x"},<br /> ...,<br /> "george"=>{"name"=>"George,,,", "gid"=>"1000", <br /> "uid"=>"1000", "shell"=>"/bin/bash", <br /> "home"=>"/home/george", "password"=>"x"}, <br />...}</span></li>
</ul>
Congratulations! :) The basic Gloves now work on your Ubuntu.<br />
<br />
Where to go next? <a href="https://github.com/yast/yast--" target="_blank">Explore</a> the Gloves source code. Check out the <a href="http://rubydoc.info/github/yast/yast--" target="_blank">documentation</a>. Read more about the library <a href="https://github.com/yast/yast--/blob/master/doc/architecture.txt" target="_blank">architecture</a>. Have more fun with the openSUSE <a href="https://github.com/yast/yast--/wiki/Tutorial" target="_blank">tutorial</a>. Give us your feedback at <a href="http://en.opensuse.org/openSUSE:Mailing_lists" target="_blank">yast-devel@opensuse.org</a> mailing-list.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-51064204765970184612011-09-02T11:52:00.001+02:002011-09-02T11:52:00.474+02:00Adding Several Repositories with a Single Installation URLThis is a simple but quite powerful feature of installation. By using a modified installation repository you can add several other repositories automatically (or let user decide which repositories to add). The only thing you need to do is to create an <b>add_on_products.xml</b> file describing all the additional repositories and add it either to root of the installation repository or root of the installation system.<div>
<br /></div><div>Installation repository can be easily modified just by adding the file there, installation system (inst-sys) can be easily extended by Linuxrc <a href="http://en.opensuse.org/SDB:Linuxrc#p_driverupdate">DriverUpdate</a>.
<br /><div>
<br /></div><div>Let's see the add_on_products.xml file format:
<br /><div><div><span class="Apple-style-span"><div></div><pre><div><?xml version="1.0"?></div><div><add_on_products xmlns="http://www.suse.com/1.0/yast2ns"</div><div> xmlns:config="http://www.suse.com/1.0/configns"></div><div> <product_items config:type="list"></div><div> <product_item></div><div> <i><!-- Mandatory --></i></div><div> <url><b>http://download.opensuse.org/repositories/devel:/languages:/ruby/openSUSE_11.4/</b></url></div><div> <i><!-- Mandatory, use "/" if you don't know --></i></div><div> <path>/</path></div><div> <i><!-- Optional, default => empty list --></i></div><div> <install_products config:type="list"></div><div> <product>Product-ID-From-Repository</product></div><div> </install_products></div><div> <i><!-- Optional, default => do not ask --></i></div><div> <ask_user config:type="boolean">true</ask_user></div><div> <i><!-- Optional, recommended if ask_user == true --></i></div><div> <name>Add-on Name to Display</name></div><div> <i><!-- Optional, default => selected --></i></div><div> <selected config:type="boolean">true</selected></div><div> <i><!-- Optional, default => none, set by packager --></i></div><div> <priority config:type="integer"><b>20</b></priority></div><div> </product_item></div><div> <product_item></div><div> ...</div><div> </product_item></div><div> </product_items></div><div></add_on_products></div></pre><div></div><div>
<br /></div><div>Items Description:</div><div><ul><li><b>url</b> - Definitely mandatory ;) Defines the URL of additional repository to add.</li><li><b>path</b> - Mandatory by design, defines additional relative path to a product at URL. Use "/" if you don't know.</li><li><b>install_products</b> / product - Optionally defines which products should be selected for installation from that URL.</li><li><b>ask_user</b> - Should be user asked whether to add this repository? Default is false and repository is just automatically added.</li><li><b>name</b> - Name of the repository used in dialog while asking user whether to add that repository.</li><li><b>selected</b> - Defines the default status of repository while asking user...</li><li><b>priority</b> - Optional item defining the priority of repository to add (an integer value between <i>0</i> - the highest priority; and <i>200</i> - the lowest priority), since <i>yast2-packager-2.21.12</i></li></ul>Although this feature works only during [auto]installation, I believe YaST could be enhanced to provide the same functionality while managing repositories on a running system too if needed.</div></span></div></div></div></div>Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com0tag:blogger.com,1999:blog-503489719545585206.post-81508373612725589262009-11-23T15:39:00.002+01:002009-11-23T15:51:10.878+01:00No Sound in Flash?<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ubd2qlySR04/Swqe4eb1AQI/AAAAAAAAAKs/s3MV1fBnTjM/s1600/Sound.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 48px; height: 48px;" src="http://3.bp.blogspot.com/_Ubd2qlySR04/Swqe4eb1AQI/AAAAAAAAAKs/s3MV1fBnTjM/s400/Sound.png" alt="" id="BLOGGER_PHOTO_ID_5407308995691348226" border="0" /></a><br />I've upgraded my <span style="font-style: italic;">openSUSE 11.1</span> <span style="font-style: italic;">64bit</span> using <span style="font-weight: bold;">esound</span> to <span style="font-style: italic;">11.2</span> <span style="font-style: italic;">64bit</span> recently and the result was <span style="font-weight: bold;">no sound in flash</span> (e.g., YouTube and other streamed video) but everywhere else it worked. I've googled around a bit but didn't find anything that would work for me. So I tried to switch to <span style="font-weight: bold;">pulseaudio</span> but the result was still the same.<br /><br />It took me some time but finally I found out that <span style="font-weight: bold;">flash-player</span> was installed in <span style="font-weight: bold;">32bit</span> version but there were no <span style="font-weight: bold;">32bit libraries for pulseaudio</span> installed. After I installed them and did the windows-like reboot, sound in flash suddenly started working.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com6tag:blogger.com,1999:blog-503489719545585206.post-75655338163919685262009-10-14T16:15:00.002+02:002009-10-14T17:14:23.824+02:00The Easiest Way How to Modify Installation System<span style="font-size:130%;"><span style="font-weight: bold;">Motivation</span></span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ubd2qlySR04/StXdr6SbflI/AAAAAAAAAKk/7z-nhnkwwUo/s1600-h/msg_info.png"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 32px; height: 32px;" src="http://2.bp.blogspot.com/_Ubd2qlySR04/StXdr6SbflI/AAAAAAAAAKk/7z-nhnkwwUo/s400/msg_info.png" alt="" id="BLOGGER_PHOTO_ID_5392459875296706130" border="0" /></a>Sometimes, there is a need to check some patch in the installation system. Of course, we have an article that describe how to <a href="http://en.opensuse.org/Linuxrc/Creating_Modified_Installation_System">Create a Modified Installation System</a> but this one takes a lot of time to prepare, you need a remote server and several things can break.<br /><br />You can also use <a href="http://en.opensuse.org/Linuxrc#p_driverupdate">Driver Update</a>, but that expects you are able to build RPM with the changes you want to test.<br /><br />Here you can see the simplest way...<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Starting-Up</span></span><br />Start installation from media by adding <span style="font-style: italic;">startshell=1</span> to the Linuxrc commandline. This will make installation open a shell window before starting YaST/Installer.<br /><br />You can also boot directly to the installation without adding <span style="font-style: italic;">startshell=1</span> to the command line but it that case you can't change files that are loaded when the installer starts. Your choice :)<br /><span style="font-size:100%;"><br /><span style="font-size:130%;"><span style="font-weight: bold;">Preparing Installation System</span></span></span><br />By default, the installation system is read-only but we can cheat it ;)! Let's assume we want to change some YaST script in <span style="font-style: italic;">/usr/share/YaST/clients/</span> directory in this example.<br /><br /><pre># The only writable directory is /tmp (and /var...)<br />cd /tmp<br /># Copy all clients to /tmp<br />mkdir clients<br />cp -ar /usr/share/YaST/clients/* /tmp/clients/<br /># Bind the writable directory to the original location<br />mount --bind /tmp/clients /usr/share/YaST/clients</pre><br />Now you can edit, extend, remove, compile ... etc. the writable <span style="font-style: italic;">clients</span> directory. Hint: If you want to start network (and your network supports DHCP) to copy the patched sources using network, just simply enter <span style="font-style: italic;">dhcpcd eth0</span> (or similarly according to your current setup).<br /><br />And ... that's all folks!<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Continuing with the Installation</span></span><br />If you have used <span style="font-style: italic;">startshell=1</span>, just simply enter <span style="font-style: italic;">exit</span> command or press <span style="font-style: italic;">Ctrl+d</span>.Koblihahttp://www.blogger.com/profile/07298029719681073643noreply@blogger.com1