import logger
import plnode.bwlimit as bwlimit
from initscript import Initscript
+from account import Account
from sliver_libvirt import Sliver_Libvirt
class Sliver_LXC(Sliver_Libvirt, Initscript):
# the generic /etc/init.d/vinit script is permanently refreshed, and enabled
self.install_and_enable_vinit()
# expose .ssh for omf_friendly slivers
- if 'omf_control' in self.rspec['tags']:
+ if 'tags' in self.rspec and 'omf_control' in self.rspec['tags']:
Account.mount_ssh_dir(self.name)
Sliver_Libvirt.start (self, delay)
# if a change has occured in the slice initscript, reflect this in /etc/init.d/vinit.slice
command = ['chmod', '755', containerDir]
logger.log_call(command, timeout=15*60)
- # customize prompt for slice owner, + LD_PRELOAD for transparently wrap bind
- dot_profile=os.path.join(containerDir,"root/.profile")
+ # customizations for the user environment - root or slice uid
+ # we save the whole business in /etc/planetlab.profile
+ # and source this file for both root and the slice uid's .profile
+ # prompt for slice owner, + LD_PRELOAD for transparently wrap bind
+ pl_profile=os.path.join(containerDir,"etc/planetlab.profile")
ld_preload_msg="""# by default, we define this setting so that calls to bind(2),
# when invoked on 0.0.0.0, get transparently redirected to the public interface of this node
# see https://svn.planet-lab.org/wiki/LxcPortForwarding"""
pathmunge /sbin after
unset pathmunge
"""
- with open(dot_profile,'w') as f:
+ with open(pl_profile,'w') as f:
f.write("export PS1='%s@\H \$ '\n"%(name))
f.write("%s\n"%ld_preload_msg)
f.write("export LD_PRELOAD=/etc/planetlab/lib/bind_public.so\n")
f.write("%s\n"%usrmove_path_msg)
f.write("%s\n"%usrmove_path_code)
+ # make sure this file is sourced from both root's and slice's .profile
+ enforced_line = "[ -f /etc/planetlab.profile ] && source /etc/planetlab.profile\n"
+ for path in [ 'root/.profile', 'home/%s/.profile'%name ]:
+ from_root=os.path.join(containerDir,path)
+ # if dir is not yet existing let's forget it for now
+ if not os.path.isdir(os.path.dirname(from_root)): continue
+ found=False
+ try:
+ contents=file(from_root).readlines()
+ for content in contents:
+ if content==enforced_line: found=True
+ except IOError: pass
+ if not found:
+ with open(from_root,"a") as user_profile:
+ user_profile.write(enforced_line)
+
# TODO: set quotas...
# Set hostname. A valid hostname cannot have '_'