summaryrefslogtreecommitdiffstats
path: root/os-plugins/plugins/vmware/XX_vmware.sh
blob: 19d03f830c310acc1ba68d449ebcb0187737d08f (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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
# Copyright (c) 2007..2008 - RZ Uni Freiburg
# Copyright (c) 2008 - OpenSLX GmbH
#
# This program/file is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org
#
# script is included from init via the "." load function - thus it has all
# variables and functions available

# TODO: nvram,functions
# write /etc/vmware/config (if a non-standard location of vmware basedir is
# to be configured), /etc/init.d/vmware

# 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... more or less useless with the
  # new plugin system
  if [ $vmware_active -ne 0 ]; then

    [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'vmware' os-plugin ...";
    # Load general configuration
    . /initramfs/machine-setup

    # write the /etc/vmware/slxvmconfig file
    # check for the several variables and write the several files:
    #  dhcpd.conf for vmnet* interfaces
    #  nat.conf for the NAT configuration of vmnet8
    #  TODO: vmnet-natd-8.mac not clear if really needed and which mac it
    # should contain (seems to be an average one)
    echo -e "# configuration file for vmware background services written in \
stage3 setup" > /mnt/etc/vmware/slxvmconfig
    # fixme: sollte unnötig sein, das hier zu tun. "vmware-env" kann hier voll
    # determiniert werden, siehe Ticket 240
    echo "vmware_kind=${vmware_kind}" >> /mnt/etc/vmware/slxvmconfig
    if [ "$vmware_bridge" = 1 ] ; then
      echo "vmnet0=true" >> /mnt/etc/vmware/slxvmconfig
    fi
    # write the common dhcpd.conf header for vmnet1,8
    if [ -n "$vmware_vmnet1" -o -n "$vmware_vmnet8" ] ; then
      # use the dns servers known to the vmware host
      local dnslist=$(echo "$domain_name_servers"|sed "s/ /,/g")
      echo "# Common dhcpd.conf header written in stage3 ..." \
        > /mnt/etc/vmware/dhcpd-head.conf
      echo "allow unknown-clients;" \
        >> /mnt/etc/vmware/dhcpd-head.conf
      echo "default-lease-time 1800;" \
        >> /mnt/etc/vmware/dhcpd-head.conf
      echo "max-lease-time 7200;" \
        >> /mnt/etc/vmware/dhcpd-head.conf
      echo "option domain-name-servers $dnslist;" \
        >> /mnt/etc/vmware/dhcpd-head.conf
     echo "option domain-name \"vm.local\";" \
        >> /mnt/etc/vmware/dhcpd-head.conf
    fi

    # variable might contain ",NAT" which is to be taken off
    if [ -n "$vmware_vmnet1" ] ; then
      cp /mnt/etc/vmware/dhcpd-head.conf /mnt/etc/vmware/dhcpd-vmnet1.conf
      local vmnet1=${vmware_vmnet1%,*} # x.x.x.x/yy,NAT => 'x.x.x.x/yy'
      local vmnat=${vmware_vmnet1#$vmnet1*} # x.x.x.x/yy,NAT => ',NAT'
      local vmip=${vmnet1%/*} # x.x.x.x/yy => 'x.x.x.x'">
      local vmpx=${vmnet1#*/} # x.x.x.x/yy => 'yy'
      local vmsub=$(echo $vmip |sed 's,\(.*\)\..*,\1,') # x.x.x.x => x.x.x
      echo -e "vmnet1=$vmnet1" >> /mnt/etc/vmware/slxvmconfig
      [ -n "$vmnat" ] && echo "vmnet1nat=true" >> /mnt/etc/vmware/slxvmconfig
      echo -e "\n# definition for virtual vmnet1 interface" \
        >> /mnt/etc/vmware/dhcpd-vmnet1.conf
      echo -e "subnet $(ipcalc -n $vmnet1|sed s/.*=//) netmask \
$(ipcalc -m $vmnet1|sed s/.*=//) {" \
        >> /mnt/etc/vmware/dhcpd-vmnet1.conf 
      echo -e "\trange ${vmsub}.10 ${vmsub}.20;" \
        >> /mnt/etc/vmware/dhcpd-vmnet1.conf 
      echo -e "\toption broadcast-address $(ipcalc -b $vmnet1|sed s/.*=//);" \
        >> /mnt/etc/vmware/dhcpd-vmnet1.conf 
      # Maybe a different ip is needed s. nat: vmnet="${vmsub}.2"
      echo -e "\toption routers $vmip;" \
        >> /mnt/etc/vmware/dhcpd-vmnet1.conf
      echo -e "}" \
        >> /mnt/etc/vmware/dhcpd-vmnet1.conf
      mknod /dev/vmnet1 c 119 1
    fi

    # vmware nat interface configuration
    if [ -n "$vmware_vmnet8" ] ; then
      cp /mnt/etc/vmware/dhcpd-head.conf /mnt/etc/vmware/dhcpd-vmnet8.conf
      local vmnet8ip=${vmware_vmnet8%/*}
      local vmpx=${vmware_vmnet8#*/}
      local vmsub=$(echo $vmnet8ip |sed 's,\(.*\)\..*,\1,') # x.x.x.x => x.x.x">
      # vmip is user for vmnet8 device
      # vmnet is user for config files nat.conf/dhcp
      local vmip="${vmsub}.1"
      local vmnet="${vmsub}.2"
      echo -e "vmnet8=$vmip/$vmpx" >> /mnt/etc/vmware/slxvmconfig
      echo -e "\n# definition for virtual vmnet8 interface" \
        >> /mnt/etc/vmware/dhcpd-vmnet8.conf
      echo -e "subnet $(ipcalc -n $vmip/$vmpx|sed s/.*=//) netmask \
$(ipcalc -m $vmip/$vmpx|sed s/.*=//) {" \
        >> /mnt/etc/vmware/dhcpd-vmnet8.conf
      echo -e "\trange ${vmsub}.10 ${vmsub}.20;" \
        >> /mnt/etc/vmware/dhcpd-vmnet8.conf
      echo -e "\toption broadcast-address $(ipcalc -b $vmip/$vmpx|sed s/.*=//);" \
        >> /mnt/etc/vmware/dhcpd-vmnet8.conf
      echo -e "\toption routers $vmnet;" \
        >> /mnt/etc/vmware/dhcpd-vmnet8.conf
      echo -e "}" \
        >> /mnt/etc/vmware/dhcpd-vmnet8.conf
      echo -e "# Linux NAT configuration file" \
        > /mnt/etc/vmware/nat.conf
      echo -e "[host]" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "ip = $vmnet/$vmpx" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "device = /dev/vmnet8" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "activeFTP = 1" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "[udp]" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "timeout = 60" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "[incomingtcp]" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "[incomingudp]" \
        >> /mnt/etc/vmware/nat.conf
      echo "00:50:56:F1:30:50" > /mnt/etc/vmware/vmnet-natd-8.mac
      mknod /dev/vmnet8 c 119 8
    fi
    # copy the runlevelscript to the proper place and activate it
    cp /mnt/opt/openslx/plugin-repo/vmware/${vmware_kind}/vmware.init \
      /mnt/etc/init.d/vmware-env \
      || echo "  * Error copying runlevel script. Shouldn't happen."
    chmod a+x /mnt/etc/init.d/vmware-env
    rllinker "vmware-env" 20 2

    #############################################################################
    # vmware stuff first part: two scenarios
    # * VM images in /usr/share/vmware - then simply link
    # * VM images via additional mount (mount source NFS, NBD, ...)

    # get source of vmware image server (get type, server and path)
    if strinstr "/" "${vmware_imagesrc}" ; then
      vmimgprot=$(uri_token ${vmware_imagesrc} prot)
      vmimgserv=$(uri_token ${vmware_imagesrc} server)
      vmimgpath="$(uri_token ${vmware_imagesrc} path)"
    fi
    if [ -n "${vmimgserv}" ] ; then
      testmkd /mnt/var/lib/vmware
      case "${vmimgprot}" in
        *nbd)
          # TODO: to be filled in ...
          ;;
        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
    
    #############################################################################
    # vmware stuff second part: setting up the environment
    
    # create needed directories and files
    for i in /var/run/vmware /etc/vmware/loopimg \
             /etc/vmware/fd-loop /var/X11R6/bin; do
      testmkd /mnt/$i
    done

    # make vmware dhcpd more silent
    touch /mnt/var/run/vmware/dhcpd-vmnet1.leases \
          /mnt/var/run/vmware/dhcpd-vmnet8.leases

    # create the needed devices which effects all vmware options
    # they are not created automatically via module load
    for i in "/dev/vmnet0 c 119 0" "/dev/vmmon c 10 165"; do
      mknod $i
    done

    chmod 0700 /dev/vmnet*
    chmod 1777 /mnt/etc/vmware/fd-loop
    chmod 1777 /mnt/var/run/vmware

    # 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.4 and versions below
    # TODO: isn't boot.slx dead/not functional due of missing ";; esac"?
    echo -e "\tmount -t usbfs usbfs /proc/bus/usb 2>/dev/null" \
      >>/mnt/etc/init.d/boot.slx

    # disable VMware swapping 
    echo '.encoding = "UTF-8"
      prefvmx.useRecommendedLockedMemSize = "TRUE"
      prefvmx.minVmMemPct = "100"' | \
      sed -e "s/^ *//" \
      >/mnt/etc/vmware/config

    ## Copy version depending files
    cp /mnt/opt/openslx/plugin-repo/vmware/${vmware_kind}/runvmware \
        /mnt/var/X11R6/bin/run-vmware.sh
    chmod 755 /mnt/var/X11R6/bin/run-vmware.sh
    cp /mnt/opt/openslx/plugin-repo/vmware/${vmware_kind}/vmplayer \
        /mnt/var/X11R6/bin/vmplayer
    if [ -e /mnt/opt/openslx/plugin-repo/vmware/${vmware_kind}/vmware ]; then
      cp /mnt/opt/openslx/plugin-repo/vmware/${vmware_kind}/vmware \
          /mnt/var/X11R6/bin/vmware
    fi


    # affects only kernel and config depending configuration of not
    # local installed versions
    if [ "${vmware_kind}" != "local" ]; then
      cp /mnt/opt/openslx/plugin-repo/vmware/${vmware_kind}/config \
        /mnt/etc/vmware
      chmod 644 /mnt/etc/vmware/config
    fi

    # write version information for image problem (v2 images don't run
    # on v1 players)
    case ${vmware_kind} in
      "vmpl1.0")
        echo "vmplversion=1" >/mnt/etc/vmware/version
      ;;
      "vmpl2.0")
        echo "vmplversion=2.0" >/mnt/etc/vmware/version
      ;;
      "vmpl2.5")
        echo "vmplversion=2.5" >/mnt/etc/vmware/version
      ;;
      "local*")
        . /mnt/opt/openslx/plugin-repo/vmware/local/versioninfo.txt
        echo "vmplversion=${vmversion}" > /mnt/etc/vmware/version
      ;;
    esac

    [ $DEBUGLEVEL -gt 0 ] && echo "done with 'vmware' os-plugin ..."

  fi
else
  [ $DEBUGLEVEL -gt 0 ] && echo "  * Configuration of vmware plugin failed"
fi