summaryrefslogtreecommitdiffstats
path: root/os-plugins/plugins/vmware/XX_vmware.sh
blob: 848bb10b79823ab4a7eeb270fce6e5511a7dc0b4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#! /bin/sh

# check if the configuration file is available
if [ -e /initramfs/plugin-conf/vmware.conf ]; then

	# load needed variables
	. /initramfs/plugin-conf/vmware.conf

	# Test if this plugin is activated
	if [ $vmware_active -ne 0 ]; then

		[ $DEBUGLEVEL -gt 0 ] && echo "executing the 'vmware' os-plugin ...";
		
		# Load general configuration
		. /initramfs/machine-setup
		# we need to load the function file for:
		# uri_token, testmkd
		. /etc/functions
		# D_INITDIR is defined in the following file:
		. /etc/sysconfig/config
		
		echo "  * vmware part 1"
		#############################################################################
		# vmware stuff first part: two scenarios
		# * VM images in /usr/share/vmware - then simply link
		# * VM images via additional mount (mount source NFS, NBD, ...)
		if [ "x${vmware}" != "x" ] && [ "x${vmware}" != "xno" ] ; then
		  # map slxgrp to pool, so it's better to understand
		  pool=${slxgrp}
		  # if we dont have slxgrp defined
		  [ -z "${pool}" ] && pool="default"
		
		  # get source of vmware image server (get type, server and path)
		  if strinstr "/" "${vmware}" ; then
		    vmimgprot=$(uri_token ${vmware} prot)
		    vmimgserv=$(uri_token ${vmware} server)
		    vmimgpath="$(uri_token ${vmware} path)"
		  fi
		  if [ -n "${vmimgserv}" ] ; then
		    testmkd /mnt/var/lib/vmware
		    case "${vmimgprot}" in
		      *nbd)
		      ;;
		      lbdev)
		        # we expect the stuff on toplevel directory, filesystem type should be
		        # autodetected here ... (vmimgserv is blockdev here)
		        vmbdev=/dev/${vmimgserv}
		        waitfor ${vmbdev} 20000
		        echo -e "ext2\nreiserfs\nvfat\nxfs" >/etc/filesystems
		        mount -o ro ${vmbdev} /mnt/var/lib/vmware || error "$scfg_evmlm" nonfatal
		      ;;
		      *)
		        # we expect nfs mounts here ...
		        for proto in tcp udp fail; do
		          [ $proto = "fail" ] && { error "$scfg_nfs" nonfatal;
		            noimg=yes; break;}
		          mount -n -t nfs -o ro,nolock,$proto ${vmimgserv}:${vmimgpath} \
		            /mnt/var/lib/vmware && break
		        done
		      ;;
		    esac
		  fi
		fi
		
		echo "  * vmware part 2"
		
		#############################################################################
		# vmware stuff second part: setting up the environment
		
		# create needed directories and files
		if [ "x${vmware}" != "x" ] && [ "x${vmware}" != "xno" ] ; then
		  for i in /etc/vmware/vmnet1/dhcpd /etc/vmware/vmnet8/nat \
		           /etc/vmware/vmnet8/dhcpd /var/run/vmware /etc/vmware/loopimg \
		           /etc/vmware/fd-loop /var/X11R6/bin /etc/X11/sessions; do
		    testmkd /mnt/$i
		  done
		  # create needed devices (not created automatically via module load)
		  for i in "/dev/vmnet0 c 119 0" "/dev/vmnet1 c 119 1" \
		           "/dev/vmnet8 c 119 8" "/dev/vmmon c 10 165"; do
		    mknod $i
		  done
		  # create the vmware startup configuration file /etc/vmware/locations
		  # fixme --> ToDo
		  # echo -e "answer VNET_8_NAT yes\nanswer VNET_8_HOSTONLY_HOSTADDR \n\
		  #192.168.100.1\nanswer VNET_8_HOSTONLY_NETMASK 255.255.255.0\n\
		  #file /etc/vmware/vmnet8/dhcpd/dhcpd.conf\n\
		  # remove_file /etc/vmware/not_configured" >/mnt/etc/vmware/locations
		
		  chmod 0700 /dev/vmnet*
		  chmod 1777 /mnt/etc/vmware/fd-loop
		  # loop file for exchanging information between linux and vmware guest
		  if modprobe ${MODPRV} loop; then
		    mdev -s
		  else
		    : #|| error "" nonfatal
		  fi
		  # mount a clean tempfs (bug in UnionFS prevents loopmount to work)
		  strinfile "unionfs" /proc/mounts && \
		    mount -n -o size=1500k -t tmpfs vm-loopimg /mnt/etc/vmware/loopimg
		  # create an empty floppy image of 1.4MByte size
		  dd if=/dev/zero of=/mnt/etc/vmware/loopimg/fd.img \
		    count=2880 bs=512 2>/dev/null
		  chmod 0777 /mnt/etc/vmware/loopimg/fd.img
		  # use dos formatter from rootfs (later stage4)
		  LD_LIBRARY_PATH=/mnt/lib /mnt/sbin/mkfs.msdos \
		    /mnt/etc/vmware/loopimg/fd.img >/dev/null 2>&1 #|| error
		  mount -n -t msdos -o loop,umask=000 /mnt/etc/vmware/loopimg/fd.img \
		    /mnt/etc/vmware/fd-loop
		  echo -e "usbfs\t\t/proc/bus/usb\tusbfs\t\tauto\t\t 0 0" >> /mnt/etc/fstab
		  # needed for VMware 5.5.3 and versions below
		  echo -e "\tmount -t usbfs usbfs /proc/bus/usb 2>/dev/null" \
		    >>/mnt/etc/${D_INITDIR}/boot.slx
		  # TODO: we still use this function? Prove if we can delete it.
		  config_vmware                                                                 chmod 1777 /mnt/var/run/vmware                                                # define a variable where gdm/kdm should look for additional sessions         # do we really need it?                                                       # export vmsessions=/var/lib/vmware/vmsessions
		
		  # directory of templates and xdialog files
		  vmdir=/mnt/var/lib/vmware
		
		  if cp ${vmdir}/templates/xdialog.sh /mnt/var/X11R6/bin/ 2>/dev/null; then
		    # create default.desktop for kdm
		    echo -e "[Desktop Entry]\nEncoding=UTF8\nName=Default\nName[de]=Standard"\
		      >/mnt/etc/X11/sessions/default.desktop
		
		    #I dont like this part, but there is no simple workaround. We need to
		    #create xdialog.sh on every box :(
		    echo "Exec=/var/X11R6/bin/xdialog.sh" \
		      >>/mnt/etc/X11/sessions/default.desktop
		    echo "Type=Application" >>/mnt/etc/X11/sessions/default.desktop
		
		    # all virtual machine clients
		    cat ${vmdir}/xdialog-files/${pool}/*.xdialog \
		      >>/mnt/var/X11R6/bin/xdialog.sh

		    # /usr/share/xsessions/* files for the menu
		    for i in /mnt/usr/share/xsessions/*.desktop; do
		      # execute
		      echo "\"$(grep '^Exec=' ${i}|sed 's/^Exec=//')\" \\" \
		        >>/mnt/var/X11R6/bin/xdialog.sh
		      # short description
		      echo "\"$(grep '^Name=' ${i}|sed 's/^Name=//')\" \\" \
		        >>/mnt/var/X11R6/bin/xdialog.sh
		      # long description
		      echo "\"$(grep '^Comment=' ${i}|sed 's/^Comment=//')\" \\" \
		        >>/mnt/var/X11R6/bin/xdialog.sh
		    done
		    # closing bracket as last line ends with '\'
		    echo ")" >>/mnt/var/X11R6/bin/xdialog.sh
		    chmod 755 /mnt/var/X11R6/bin/xdialog.sh
		
		    # copy xdm files, so we could choose them before we log in
		    for i in ${vmdir}/xdmsessions/${pool}/*.desktop;do
		      cp ${i} /mnt/etc/X11/sessions/
		    done
		  else
		    error "$scfg_vmchs" nonfatal
		  fi
		  # we configured vmware, so we can delete the not_configured file
		  rm /mnt/etc/vmware/not_configured 2>/dev/null
		
		  # copy dhcpd.conf and nat for vmnet8 (nat)
		  # fixme: It should be possible to start just one vmware dhcp which should
		  # listen to both interfaces vmnet1 and vmnet8 ...
		  cp /mnt/var/lib/vmware/templates/dhcpd.conf \
		    /mnt/etc/vmware/vmnet8/dhcpd 2>/dev/null
		  cp /mnt/var/lib/vmware/templates/nat.conf \
		    /mnt/etc/vmware/vmnet8/nat 2>/dev/null
		fi
		
		[ $DEBUGLEVEL -gt 0 ] && echo "done with 'vmware' os-plugin ...";

	fi
fi