Sunday, November 17, 2013

Vboxwebsrv with systemd on openSUSE

This works if you need to restart vboxwebsrv using systemd in openSUSE. Some folks  will raise some eye browse with this configuration for sure :-). The USER-NAME in the entry below is the username of the user who will access vboxwebsrv.



Create a unit file in /etc.

  •  /etc/systemd/system/VBoxWeb.service 

why etc? because according to the man pages somewhere that if a local admin will make a unit file it should be in /etc because the order of which the unit file to be executed. Meaning if you have conflicting unit files in /usr and in /etc then the latter will be prioritize. Note that packages (*.rpm) unit files are in /usr.


Put the entry below inside that unit file.


 [Unit]
 Description=VirtualBox Web Service
 After=network.target

 [Service]
 Type=forking
 PIDFile=/run/VBoxWeb/VBoxWeb.pid
 EnvironmentFile=/usr/lib/systemd/system/VBoxWeb.service
 ExecStartPre=/bin/bash -c 'if [[ -e $PIDFile ]]; then rm -f "$PIDFile"; fi'

 ExecStart=/usr/bin/vboxwebsrv --pidfile "$PIDFile" --background
 Restart=on-failure
 User=USER-NAME
 Group=vboxusers

 [Install]
 WantedBy=multi-user.target





 This is not a shell script! That is what systemd folks will say for sure ;-). The ExecStartPre in that unit file is removing (deleting) the pid file so when vboxwebsv should restart  you will not get any errors. The EnvironmentFile entry is like sourcing a shell script. In this case it is sourcing the unit file itself, hence the variable PIDFile. Note that with systemd 208 which is the default fro 13.1 the ExecPre line in that unit file is not required anymore, seems systemd is much smarter now a days! :-). 12.3 below you might still need it.


Create the temporary files and directories.

  •  echo "d /run/VBoxWeb 0755 USER-NAME vboxusers" > /etc/tmpfiles.d/VBoxWeb.conf 

  •  mkdir /run/VBoxWeb 


Change the permission.

  •  chown USER-NAME:vboxusers /run/VBoxWeb 

  •  chmod 755 /run/VBoxWeb 


Disable the vboxwebsrv service that came with VirtualBox package.

  •  chkconfig vboxweb-service off 

or

  •  systemctl disable vboxweb-service.service 


Start your newly created (unit file)  Daemon.

  •  systemctl start VBoxWeb.service 

Enable your newly created (unit file)  Daemon.

  •  systemctl enable VBoxWeb.service



This is very useful when you are using phpvirtualbox and you are restarting the vms every once in a while.


Cheers...

Thursday, October 10, 2013

VirtualBox Autosave Autostart of vms

This assumes that you are the only user on your system if not then you can try my Phpvirtualbox  guide. You do not need your favorite sudo utility nor running su just to set your vms to auto. Enable the systemd service one time and use VBoxManage to set your vms to auto.


 Download the script that will handle the vms.
  •  wget https://raw.github.com/Jetchisel/VBoxAutostart/master/systemd-vboxinit 
Copy it to your ~/bin directory.
  •   cp -v systemd-vboxinit ~/bin   
Make it executable.
  •  chmod ug+x ~/bin/systemd-vboxinit 

Change the group to vboxusers
  •  chgrp vboxusers ~/bin/systemd-vboxinit 


2. Download the unit file that will execute your script during boot/restart/shutdown of the host.
  •  wget https://raw.github.com/Jetchisel/VBoxAutostart/master/VBoxAutostart@.service 
Replace The ExecStart and ExecStop part with your "$HOME"/bin as the PATH
  •  cp -v VBoxAutostart@.service /usr/lib/systemd/system 
 Start that service.
  •  systemctl start VBoxAutostart@your-user-name.service 
Enable it .
  •  systemctl enable VBoxAutostart@your-user-name.service 
Check the status.
  •  systemctl status VBoxAutostart@your-user-name.service 
your-user-name is your user name not mine :-)

 3. Choose your vms that you want to autostart and autosave during boot/restart/shutdown of your host.

Get the names of the vms.
  •   VBoxManage list vms  
Set it to auto so the script will handle the autostart and autosave of the vm.
  •  VBoxManage setextradata YOUR-VM-NAME pvbx/startupMode auto 
Get the status.
  •   VBoxManage getextradata YOUR-VM-NAME pvbx/startupMode 

       Set it to manual if you dont want your vms to be handled by the script.
      •  VBoxManage setextradata YOUR-VM-NAME pvbx/startupMode manual 
      Set it to empty 'No value' the same thing it will be ignored by the script.
      •   VBoxManage setextradata YOUR-VM-NAME pvbx/startupMode 
        •   You can use the ExtraData script from the zip file below to manage your vms. 

          4. To access your vms.
          •  rdesktop localhost:1234 

          where 1234 is the port number which you can set via the gui or via VBoxManage.

          A gui app which you can use is krdc for Kde and   gnome-rdp for Gnome.

          The zip file from github. https://github.com/Jetchisel/VBoxAutostart/archive/master.zip

          I have package this stuff and it's in OBS now as an rpm. Look for systemd-vboxinit

           NOTE: if you have the Phpvirtualbox solution then you do not need this thus it can conflict with each other.

          Monday, September 23, 2013

          PhpSysInfo

          Download the latest release in  http://sourceforge.net/projects/phpsysinfo/files/latest/download 


          Unpack that tar ball. I choose to install in /data/apache2.
          •  tar -zxvf phpsysinfo-"$version"-tar.gz -c /data/apache2
          Set up sysinfo.
          •  cd /data/apache2/phpsysinfo-"$version" 
          •  cp -v phpsysinfo.ini.new phpsysinfo.ini 
          Set permission.
          •  chown -Rv wwwrun:www /data/apache2/phpsysinfo-"$version" 

          Add an entry to apache2 config
          •  vi /etc/apache2/conf.d/phpSysInfo.conf 

          Add the entry below

            
            Alias /sysinfo /data/apache2/phpsysinfo-"$version"

            <Directory /data/apache2/phpsysinfo-"$version">
               Options Indexes MultiViews FollowSymLinks
               Order allow,deny
               Allow from all
            </Directory>

           

          Again the only thing to adjust to your set up is /data/apache2.

          Restart apache2
          •  systemctl restart apache2.service 


          Type the url on your browser
          •  localhost/sysinfo 






















          Thursday, September 19, 2013

          phpVirtualBox on openSUSE reloaded


          phpVirtualBox home page has been moved from google to sourceforge it is in http://sourceforge.net/projects/phpvirtualbox/files/latest/download.  You will need to install VirtualBox since it is just a front end.  before you can use this app. Refer to my guide on how you can install vbox.  After you have installed vbox you will install a web server. We will use apache2 as an example. You can either use yast2 software management to install the lamp_server pattern and some php packages or use our friend zypper.

            In this setup i choose to install to a different directory than /srv/www/htdocs. So just in case something unrecoverable happens :P in my system i will not delete the directory where phpvirtuablox resides. Here i choose /data/apache2. You can put it any where you like just replace the config entry in apache2.

            To install the packages using zypper
              •     zypper in patterns-openSUSE-lamp_server php5-soap      

                 Create an entry for apache2
                  •     vi /etc/apache2/conf.d/phpvirtualbox.conf   

                  The only thing you need to replace to meet your setup is    /data/apache2  the rest is as-is.


                    Alias /phpvirtualbox  /data/apache2/phpvirtualbox

                    <Directory   /data/apache2/phpvirtualbox>
                       Options Indexes MultiViews FollowSymLinks
                       AllowOverride All
                       Order allow,deny
                       Allow from all
                    </Directory>



                     Unpack that zip file using unzip into /data/apache2.
                      •   unzip phpvirtualbox-"$version".zip -d /data/apache2/ && cd /data/apache2 
                        Rename that file to just phpvirtualbox
                          •   mv -v phpvirtualbox-"$version" phpvirtualbox && cd phpvirtualbox 

                            Now rename the php file
                              •  mv config.php-example config.php 

                                Edit that config.php file and put the name of the user which uses virtualbox and the corresponding line and do it like this.
                                     
                                    
                                    var $username = 'jetchisel';                                  
                                    var $password = 'mypassword';


                                  •   var $ location = 'http://127.0.0.1:18083';  

                                  •  var $consoleHost = 'IP ADDRESS OF YOUR COMPUTER'; 

                                  Create an file called virtualbox in /etc/default and put something like this.


                                    VBOXWEB_USER=jetchisel



                                  Set permissions as root run the following commands.

                                    •   chgrp -Rv vboxusers /data/apache2/phpvirtualbox  
                                    •   chmod -Rv 775 /data/apache2/phpvirtualbox   

                                       Edit that config.php file, un comment out the following.

                                          
                                          var $startStopConfig = true;
                                          
                                          var $enableAdvancedConfig = true;
                                                                         



                                        For the deprecated system V.
                                           Download the vboxinit for SuSE.
                                            •  wget https://raw.github.com/Jetchisel/vboxinit/master/sysV-vboxinit -O vboxinit 
                                              copy the script to /etc/init.d
                                                •  cp -v vboxinit /etc/init.d/vboxinit 
                                                  set permission.
                                                    •  chmod u+rx /etc/init.d/vboxinit  
                                                      Enable init script.
                                                        •  chkconfig vboxinit on  
                                                             Check the script if it is working
                                                                  •  /etc/init.d/vboxinit {start|stop|restart|status} 

                                                                  Enable the init scripts at boot time.

                                                                      •   chkconfig vboxweb-service on 

                                                                      Restart the init scripts as root run the following.
                                                                      •  service vboxautostart-service restart 
                                                                      •  service vboxweb-service restart 

                                                                      For SYSTEMD

                                                                       Download the systemd version  for SuSE.
                                                                      •  wget https://raw.github.com/Jetchisel/systemd-vboxinit/master/systemd-vboxinit 
                                                                      You can save it to any place you want even in /home/user/bin. In this example i choose to put in  to /usr/lib/systemd/
                                                                      •  cp -v systemd-vboxinit /usr/lib/systemd 
                                                                      Set permissions
                                                                      •  chmod ug+x /usr/lib/systemd/systemd-vboxinit 
                                                                      •  chgrp vboxusers /usr/lib/systemd/systemd-vboxinit


                                                                      Create a systemd unit  "vboxvmservice.service" (or any name that suits you)
                                                                      inside /usr/lib/systemd/system and add the entry below: Replace " username " with the user that belongs to the vboxusers group.

                                                                        

                                                                             [Unit]
                                                                             Description=VBox Virtual Machine  Service
                                                                             Requires=systemd-modules-load.service
                                                                             After=systemd-modules-load.service
                                                                             Before=shutdown.target reboot.target halt.target     


                                                                             [Service]
                                                                             Type=oneshot
                                                                             User=username
                                                                             Group=vboxusers

                                                                             KillMode=none
                                                                             StandardOutput=syslog+console
                                                                             EnvironmentFile=/etc/default/virtualbox
                                                                             ExecStart=/usr/lib/systemd/systemd-vboxinit start
                                                                             ExecStop=/usr/lib/systemd/systemd-vboxinit stop
                                                                             RemainAfterExit=yes

                                                                             [Install]
                                                                             WantedBy=multi-user.target


                                                                                                 

                                                                      If you choose to save the systemd-vboxinit script in another path and not /usr/lib/systemd then you need to adjust the following entry.

                                                                      •  ExecStart=/path/to/file/systemd-vboxinit start
                                                                      •  ExecStop=/paht/to/file/systemd-vboxinit stop 

                                                                      Start that newly created unit.
                                                                      •   systemctl start vboxvmservice.service 
                                                                      Enable the service at boot time.
                                                                      •  systemctl enable vboxvmservice.service 

                                                                      Enable the init scripts;

                                                                        •  systemctl enable vboxweb-service.service 

                                                                        Start and enable apache2.
                                                                        •   systemctl start apache2.service 
                                                                        •  systemctl enable apache2.service 

                                                                        In your browser type the url below:
                                                                        •   localhost/phpvirtualbox  

                                                                        First log in:
                                                                        •  username: admin 
                                                                        •  password: admin  























                                                                        After a log in you can add a user that can handle your vms.





























                                                                        Configure vms in phpvirtualbox's graphical menu.
                                                                        •  Settings --> General --> Basic --> "StartupMode --> Automatic" 























                                                                         An example of running vms at boot.





















                                                                        Checking the status of your unit after booting.






                                                                        Zip file from github:  https://github.com/Jetchisel/systemd-vboxinit/archive/master.zip

                                                                        You can search phpvirtualbox for an rpm package of this in OBS.

                                                                        Kudos to Mr. Ian Moore the author of phpvirtuabox.

                                                                        
                                                                        

                                                                        Sunday, August 25, 2013

                                                                        OpenSuSE on usb grub2

                                                                        Since 12.2 release opensuse has grub2 as an option to use. Come 12.3 it is the default grub in the installation but you can always choose to use the old legacy grub. As of this time of my blog entry Aug 2013, grub2 is still in development but usable (so they say :P ).

                                                                        Then if your using the old legacy grub  suse has some options to edit the necessary entry in order to boot your system when it has some boot issues.
                                                                        Sadly if you use grub2 then it is only limited to the following:







































                                                                        As you can see theres a lot of missing files to be edited unlike old legacy grub.
                                                                        Well some files were either renamed or removed completely. Grub2 has the following (but not limited to)  files:

                                                                        1. /boot/grub2/.device.map
                                                                        2. /etc/default/grub
                                                                        3. /boot/grub2/grub.cfg
                                                                        4. /etc/grub.d/

                                                                         If your going to do a usb install  then you should not follow the suggested partitioning from the installer since i may offer to use the existing internal partitions or worst suggest to delete it completely. Untick the "proposed separate home partition". Choose create partition setup and check your other partitions if they are mounted automagically by the installer if it is indeed mounted then umount it. The partitioning i suggest is to make the first part the root and if you really need a separate /home then put it in the second partition. A swap partition will be the last. Other wise you will be thrown at the grub prompt during the first reboot ;-(.



                                                                        You will probablly will encounter some errors similar to  this.









                                                                        This is to be expected, dont worry you can just copy the error somewhere.

                                                                        Let it reboot after the installation and boot again from the dvd and choose installation in the menu. 




































































































































































































                                                                        Once booted to your system you can  do the following commands.

                                                                        echo '(hd0)  /dev/disk/by-id/ata.....' > /boot/grub2/device.map

                                                                        Make sure you got the correct id of you disk.
                                                                        ----

                                                                          grub2-install --force /dev/sda1  

                                                                        /dev/sda1 is my root partition so point it to yours.

                                                                        Yo will get a WARNING but the important message is the last.







                                                                        ----


                                                                            grub2-mkconfig -o /boot/grub2/grub.cfg     

                                                                        ----
                                                                            /sbin/mkinitrd/     


                                                                        Now if you will not see any errors from the last command then it is safe to reboot.

                                                                        This hack is also true if you cloned your disk. This does not apply to efi system since i do not have any close encounter with EFI (at least not yet :P )

                                                                        Enjoy folks!

                                                                        Tuesday, April 17, 2012

                                                                        Things you can do with packages based on time.

                                                                        RPM keeps a history of installed things. In opensuse there is also a var log zypp history.  Here is an example of checking packages based on time.

                                                                            rpm -qa --qf '(%{INSTALLTIME:date})%{NAME}\n'

                                                                        Will yield something like this:


                                                                         (Mon 20 Feb  2012  01:45:49  PM   UTC) libSDL-devel
                                                                         (Wed 30 Nov 2011  06:24:38  PM   UTC) kdebase4-workspace-liboxygenstyle
                                                                         (Sat   14 Apr  2012  07:27:40  AM   UTC) ffmpegthumbnailer
                                                                         (Wed 30 Nov 2011  06:19:28   PM  UTC) ptools
                                                                         (Thu  05 Jan   2012  07:41:54  AM   UTC) NetworkManager
                                                                         (Fri    11 Nov  2011  12:17:16  AM   UTC) xorg-x11-driver-video
                                                                         (Wed 01 Feb   2012  01:32:00  AM  UTC) libmysqlclient_r18
                                                                         (Wed 30 Nov  2011  09:22:45  PM   UTC) libwpg-0_2-2
                                                                         (Wed 30 Nov  2011  06:21:22  PM   UTC) gegl-0_1
                                                                         (Sun  01 Apr   2012  08:00:55  PM  UTC) glibc-locale-32bit


                                                                        Ckecking /var/log/zypp/history

                                                                          while  IFS=\| read -ra line; do [[ $line = \#* ]] && continue; echo "${line[0]} -> ${line[2]}"; done < /var/log/zypp/history  

                                                                        Or if you change your shell to something more advance :-), you can use awk.

                                                                         awk -F '|' '/^#/ {next} {printf("%s -> %s\n", $1, $3)}' /var/log/zypp/history 

                                                                        Will yield something like this:


                                                                         2012-04-16 06:41:57 -> libquicktime0
                                                                         2012-04-16 06:42:23 -> avidemux
                                                                         2012-04-16 06:42:26 -> libswscale0
                                                                         2012-04-16 06:42:28 -> libpostproc50
                                                                         2012-04-16 06:42:41 -> libavcodec52
                                                                         2012-04-16 06:42:49 -> smplayer
                                                                         2012-04-16 06:42:54 -> gmplayer
                                                                         2012-04-16 06:43:02 -> mlt
                                                                         2012-04-16 06:43:40 -> kino
                                                                         2012-04-16 06:43:44 -> libavformat52
                                                                         2012-04-16 06:43:57 -> smplayer-themes
                                                                         2012-04-16 06:44:15 -> kdenlive
                                                                         2012-04-16 06:44:18 -> libavfilter1


                                                                        If you want to know when a specific package was installed or updated you can just filter out the correct package name as shown on  below.

                                                                         rpm -qa --qf '(%{INSTALLTIME:date}) %{NAME}\n'  '*packagename*' 

                                                                        Using awk to print out a certain field but in this example we just print out the whole line.

                                                                          awk '/packagename/{print $0}'  < <(rpm -qa --qf '(%{INSTALLTIME:date}) %{NAME}\n') 

                                                                        Replace packagename with the correct one and you should be fine. That  looks good, now we want to take action about the packages that is based on a certain time/date. First we need to sanitize the packages names, meaning we only need to extract the names and not the date so we can take action (eg pass the output to zypper). Let us go back to the first example using rpm to query packages. IMHO a better tool for extracting only the names is awk. Here is an example.


                                                                         rpm -qa --qf '(%{INSTALLTIME:date}) %{NAME}\n' |  awk '/Sun 01 Apr 2012/{print $NF}'  


                                                                         will yield something like this:


                                                                         wavpack
                                                                         glibc-locale
                                                                         glibc-info
                                                                         libmp3lame0
                                                                         aircrack-ng
                                                                         vlc-qt
                                                                         glibc-32bit
                                                                         ladspa-lemux
                                                                         libmad0
                                                                         2ManDVD
                                                                         glibc-i18ndata
                                                                         glibc
                                                                         libfaac0
                                                                         faac
                                                                         twolame
                                                                         vlc
                                                                         glibc-devel
                                                                         liba52-0
                                                                         libzen0
                                                                         libxvidcore4
                                                                         xvidcore
                                                                         libvlc5



                                                                        The awk code above looks for lines with the date 'Sun 01 Apr 2012' on it and then prints the last field so the result is just the package names that we are after. You can test the output without printing the last field by removing the last part of the code, then the awk code will be like   awk '/Sun 01 Apr 2012/' . You can even add the specific time (hours minutes and seconds) so you can have more control on the search, just add the end of the date of your awk code before the last /. After that you need  to pass it to zypper, fortunately bash4 has a builtin feature called mapfile aka readarray. This is an example of using mapfile for that, run this code as a normal user like the rest of the previous code.


                                                                            mapfile -t < <(rpm -qa --qf '(%{INSTALLTIME:date}) %{NAME}\n' | awk '/Sun 01 Apr 2012/{print $NF}')

                                                                          echo zypper rm "${MAPFILE[@]}"


                                                                        You will see the out put of what zypper will remove from your installed packages. If you are satisfied with zypper's proposal then you can run that above code; again as root without the 'echo'  so that zypper can remove the packages. Remember that mapfile is a bash4 feature if your bash is lower than bash4 you can use read and IFS.



                                                                          IFS=$'\n' read -rd '' -a files < <(rpm -qa --qf '(%{INSTALLTIME:date}) %{NAME}\n' | awk '/Sun 01 Apr 2012/{print $NF}')

                                                                          echo zypper rm "${files[@]}"



                                                                          For those of you who change the default shell to something more advance :-). Try
                                                                         creating a script with a shebang  #!/bin/bash  and put the out put of the code:

                                                                           rpm -qa --qf '(%{INSTALLTIME:date}) %{NAME}\n' | awk '/Sun 01 Apr 2012/{print$NF}' ORS=" " > myscript


                                                                        Now open that myscript with your favorite text editor and add the shebang then prefend   zypper rm   and a literal white space before the first package name then make it executable and  finally execute it.

                                                                        I have done this only in a vm just for a proof of concept and it works as expected. I have never been in a situation where i am forced to do such hacks in my production system. For those of you who are adventurous enough to try tumbleweed release then this might be the solution if you ever get into desperate situations that needs desperate measures to solve  it :-).


                                                                        Take it easy!






                                                                         





                                                                        Saturday, March 10, 2012

                                                                        systemd-qserv

                                                                        This is an interactive script that can handle most of the task regarding systemd services. It is just a front end for systemctl and not a replacement. What it does is it make's your life easier by avoiding to type extension '*.service' again and again  while dealing with services. Imagine if you want to stop at least 4 services at once, hence you will type 'systemctl stop one.service two.service three.service four.service' , you need to type additional eight  characters on each service names  which means 32 characters long! Systemd-qserv will allow you to enter just their names without an extension '*.service or even a mix of like 'apache2 sshd msyql xinetd.service nfs.service' would be just fine.

                                                                        So why did it came up in OBS? while other scripts that are well written did not end up in OBS? first of all kudos to Boris Manojlovic for packaging this stuff. Now to answer the question, most of the script's that are out there is specific to just one application. Come openSUSE 12.1 systemd is the default whether you like it or not and it does not care what DE do you use or if you even use one at all. You can find the package in my home repo.  The source is there too.



                                                                        snapshot.






















                                                                        This is an example of running qserv.sh directly as a normal user. and trying to stop some services.


























                                                                         As you can see normal user can run the script since it is only a front-end to systemctl but stopping service or services will be done by systemctl itself and this script has no control over systemd's systemctl!



























                                                                        Now for those of you who shun systemd-qserv you can do some tricks to avoid repeating *.service again and again. Here's an example.

                                                                         systemctl start {apache2,sshd,mysql,nfs,cifs,cups,vboxdrv,postgresql}.service 

                                                                        The above code is equivalent to:

                                                                         systemctl start apache2.service sshd.service mysql.service nfs.service vboxdrv.service postgresql.service 

                                                                        This works on a bash shell which is the default for openSUSE, if you change your shell, then you probably know what you are doing so have fun doing the same with your current shell :-)

                                                                        Just try it sometime folks.