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.

                                                                Tuesday, March 6, 2012

                                                                halt or Halt?

                                                                Some folks missed the old halt command which seems to work the same as power off. OpenSuSE now uses /sbin/shutdown for that matter, how ever you can still have the same command with some few steps as explained below.

                                                                Create  the file    /etc/bash/bashrc.local    (assuming that you are using bash as your shell ) or any place that a shell is sourced when it is invoked and put the line below.

                                                                  Halt() { if (( $EUID == 0 )); then  shutdown -h -P now; else su root -c'shutdown -h -P now'; fi ; }  



                                                                Now as a normal user and root can invoke the command   Halt    and will point to /sbin/shutdown with the arguments -h -P. As a normal user you will be ask for the root's password. Notice the capital H and not h, halt is already in the root's path so we used the capital H but if you want to use halt to replace Halt from the beginning of the line which is still possible and without any issues, the only issue with this is that you get used to that command that is defined in your current system and then when your not in that system and run halt, you will end up scratching your head as to why it did not work as expected! Now how can you be so sure that this is the first to be called and not the one that is in your root's path? See man bash COMMAND EXECUTION for more detailed info. So how can you be so sure that bash is your default shell? you can check the config file  /etc/passwd   by running the command.  grep username /etc/passwd    where username is your username.

                                                                To explain about whats going on in that line above here are some explanations.

                                                                That line is called a function see man bash and look for functions. In short functions are the same as an alias but more powerful and has more advantages. It is using the if clause/statement that checks if the user's user id that is running that command is equal to 0 (which is root) or not. When it found that root is running the command it will run the first command which is  shutdown -h -P    if it is not root it will run the second  command which is   su root -c'shutdown -h -P now'  . As to why we choose to put  in   /etc/bash/bashrc.local   run   head -n 8 /etc/bash.bashrc   so you can read up about that local file. Come 12.1 systemd is in used by default so for those of you who are a systemd hardcore fan boys/girls you can just replace the  shutdown -h -P now  with   systemctl poweroff   and your systemd will be in full force :-). This setup is not specific to any DE, it will work even on a minimal install or the server install. KDE has its own settings which you can find in    /usr/share/kde4/config/kdm/kdmrc     other DE might have their own config file as well. When you want to check if a program or command  is already installed one would use the external command  which  but it does not know about functions or builtins of bash. One could use the built in   type   of bash as a normal user run  type Halt  and you should see something like this.

                                                                Halt is a function
                                                                Halt ()
                                                                {
                                                                    if (( $EUID == 0 )); then
                                                                        shutdown -h -P now;
                                                                    else
                                                                        su root -c'shutdown -h -p now';
                                                                    fi
                                                                }

                                                                Add an -a flag so you can see if there are more than one match. A Reboot function is easily created using the same syntax by the way :-).

                                                                Enjoy folks!


                                                                keeping packages locally

                                                                This might be useful if you have a limited internet band width. Just in case you need to reinstall or install from another machine, you do not need to download the packages again.

                                                                After the installation immediately before you run the update in your fresh installed suse run the command below, It will ask you the root's password and will tell you that rpm caching is enabled on the remote repositories.

                                                                Activate packages caching on your enabled repositories. Create a function like this and put it in /etc/bash.bashrc.local

                                                                keepackages () {
                                                                    if (( EUID !=0 )); then
                                                                        echo 'Root privileges are required for modifying system repositories.' 1>&2
                                                                        return 1
                                                                    fi
                                                                    while IFS="|" read -ra line; do
                                                                        [[ ${line[3]} = *Yes* ]] && zypper mr -k "${line[0]// /}"
                                                                    done < <(zypper lr)
                                                                }

                                                                Now you can just run   keepackages 


                                                                Backup the file  /etc/zypp/zypp.conf run the command:

                                                                  su root -c'cp /etc/zypp/zypp.conf  /etc/zypp/zypp.conf.orig'  

                                                                Edit that zypp.conf file run the command:

                                                                  printf '%s\n' 'g/^#[[:space:]]*download.use_deltarpm/s/^#[[:space:]]*/' w | ed -s /etc/zypp/zypp.conf   

                                                                 printf '%s\n' 'g/^\(download\.use_deltarpm[[:space:]]*=\)[[:space:]]*true$/s//\1 false/' w | ed  -s /etc/zypp/zypp.conf  

                                                                This section of that config file explains what it's doing. Of course you can just uncomment out that entry :-).

                                                                ##
                                                                ## Whether to consider using a .delta.rpm when downloading a package
                                                                ##
                                                                ## Valid values: boolean
                                                                ## Default value: true
                                                                ##
                                                                ## Using a delta rpm will decrease the download size for package updates
                                                                ## since it does not contain all files of the package but only the binary
                                                                ## diff of changed ones. Recreating the rpm package on the local machine
                                                                ## is an expensive operation (memory,CPU). If your network connection is
                                                                ## not too slow, you benefit from disabling .delta.rpm.
                                                                ##
                                                                # download.use_deltarpm = true

                                                                ##
                                                                ## Whether to consider using a deltarpm even when rpm is local
                                                                ##
                                                                ## Valid values: boolean
                                                                ## Default value: false
                                                                ##
                                                                ## This option has no effect unless download.use_deltarpm is set true.
                                                                ##
                                                                #  download.use_deltarpm.always = false

                                                                 

                                                                If you want to check which is option it is using you can run grep on it.

                                                                 grep -E -v '^($|#|;|\[)' /etc/zypp/zypp.conf 

                                                                You are now ready to update your system use the command below and accept the package key's.

                                                                 su root -c'zypper ref && zypper up' 

                                                                When it's done reboot just to be sure that update will take effect on your system and you can   find those rpm packages inside the directory  /var/cache/zypp/packages/   and it has it's own sub directories. Create a directory somewhere and copy those packages in there. While you are inside your home directory you can do the following commands.

                                                                Create a new directory.
                                                                   mkdir public_html/packages/  

                                                                Copy the rpm' from source to destination.
                                                                This rely on GNU/find and since suse use it by default it is not an issue and it should be used.
                                                                   find /var/cache/zypp* -name '*.rpm' -exec  cp -vu  {} public_html/packages/  \;

                                                                 New to bash 4.
                                                                 shopt -s globstar; rpm=(/var/cache/zypp*/**/*.rpm);  cp -vu "${rpm[@]}" public_html/packages 


                                                                This is a portable solution according to the demi god's with in the bash world! :-)
                                                                 find /var/cache/zypp* -name '*.rpm' -exec sh -c 'cp -vu -- "$@" public_html/packages/' _ {} + 

                                                                When you installed a package using zypper but it is a local install that rpm will be inside   /var/cache/zypper/  so using the   *   glob pattern matching will match zypper and zypp. So  you dont need to replace    /zypp   with  /zypper  to copy packages from those directory. Also it makes no sense to look for packages under   /var/cache   and as a normal user you don't have enough permission to poke into some directories under it.  That find command will search recursively for the file extension ending in rpm using also the (  *   glob ) and cp copies all of those files into your newly created directory, while the -vu flag means verbose and update so it only copies the new rpm from the source to it's destination and not copy everything again from the beggining.  You can change the path of the destination at your own heart's content but this place is important for the next step that will be describe about creating your local repository. You can run that command every time you install a new package. Just remember if you add a new repository before you install anything run the very first command in this guide so that package caching will take effect on that repo as well. When the time comes that rpm's are filling up your   /var/cache    directory you might need to delete them all, well you can just delete them at once using zypper. If you want to clear the   /zypper   directory you can use the find command as shown below. You can modify the path so you can delete other rpm's. We need to be root since that directories are restricted for read rights for normal users. Just remember to be careful when deleting files from the shell because it might not be recoverable.

                                                                Using zypper and it should be your first option.
                                                                  su root -c'zypper clean --all' 

                                                                 Search and Destroy rpm packages if zypper did not do it's job well!
                                                                   su root -c'find /var/cache/zypp*  -name '*.rpm' -delete' 

                                                                New to bash 4
                                                                 shopt -s globstar; rpm=(/var/cache/zypp*/**/*.rpm);  rm  "${rpm[@]}" 

                                                                Now what if you forgot to do rpm caching and did the update, is it still be possible to download the rpm and it's dependencies? The answer is yes, but only if those rpm packages are in your list of repositories. Fortunately zypper will just tell you if the packages that you are trying to re download is not found at any or your repos. Zypper will ask you to resolve some dependency issue and will give you some options, just don't choose the "break your system and be happy" option :-).  Thus we can run the command as root:


                                                                   readarray -t packages < <(rpm -qa --qf '%{NAME}\n'); zypper in -f -d "${packages[@]}"  

                                                                                                                         The other version :-)
                                                                  mapfile -t < <(rpm -qa --qf '%{NAME}\n'); zypper in -f -d "${MAPFILE[@]}"  

                                                                                              If you dont have bas4 which is highly unlikely but hey....
                                                                  IFS=$'\n' read -rd '' -a packages < <(rpm -qa --qf '%{NAME}\n'); zypper in -f -d "${packages[@]}"  

                                                                Just choose one but it is specific to bash 4 only. What it does is readarray aka mapfile load lines from a file or stream. The rpm command put it's output in that file or mapfile and then zypper read's those output one at a time. The -f switch is to do a force reinstall and the -d switch is download only,  just to download only and not install. To understand what's going on in that rpm command you can try to run it in a shell just remove it inside the open and close ( ) parenthesis.That odd looking "${packages[@]}" is indeed very useful since it quote all the element before zypper can read it and from experience if you have an rpm which name has a white space in between, it will save you the head ache :-). After it's done you can repeat  that find command so it will copy the newly downloaded rpm to your  public_html/packages    directory.

                                                                Now you have yourself a local copy of rpm in you and ready for future use. You can create a local repository using yast. Just point it to that directory (packages/) and your good to go. If you want to make a remote repository of those rpm files you can create a plain rpm repo using the package createrepo. You will need a running http server for that since it is the most easy to setup. The following steps will guide you to setup a local repository using the http protocol.

                                                                Install the pattern lamp_server and createrepo.

                                                                  su root -c'zypper in patterns-openSUSE-lamp_server createrepo' 


                                                                Go inside that packages/ directory and run createrepo.

                                                                 cd public_html/packages && createrepo .     #note the trailing white space and a dot.











                                                                 It will create a repodata/ directory, go inside that directory and

                                                                  cd repodata/ 

                                                                generate your key it will ask you some simple but important questions.

                                                                  gpg --gen-key 
























                                                                Check your generated key.

                                                                  gpg --list-key    












                                                                Create a  detached signature repomd.xml.asc to repo.xml.

                                                                  gpg -a --detach-sign repomd.xml 







                                                                Create a repomd.xml.key file and export the public key to it.

                                                                  gpg -a --export YOUR_PUBLICKEY > repomd.xml.key   #note the direction











                                                                Start your http serve.

                                                                  su root -c'rcapache2 start' 

                                                                Systemd from starting from 12.1
                                                                 systemctl restart apache2.service 












                                                                Now in your browser type the url below where username is the user in your system.

                                                                  localhost/~username  






















                                                                If that is successful  you can add that repo via zypper or yast. Use the command below to add that repo via zypper.

                                                                 su root -c'zypper ar http://localhost/~username/packages/ local' 













                                                                Where username is the name of the user and local will be the name of that repository, you can change that to whatever you want it to be called.

                                                                Refresh that newly added local repository.

                                                                   su root -c'zypper ref local' 

                                                                Accept the public key and your repo is good to go.








                                                                 



















                                                                If you are accessing it remotely meaning from another machine or from a virtual machine replace the localhost with it's correct ip which you can get from the out put of  ip r   Now you have your own remote repository in your  lan! If you added some new rpm packages on your repo you will need to run createrepo again so createrepo will know that there are some changes.


                                                                Enjoy!

                                                                The following links below should help you set up if not get an idea about setting up your repositories locally.