summaryrefslogtreecommitdiffstats
path: root/abs/core/LinHES-config/mv_fileshare.py
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core/LinHES-config/mv_fileshare.py')
-rwxr-xr-xabs/core/LinHES-config/mv_fileshare.py461
1 files changed, 461 insertions, 0 deletions
diff --git a/abs/core/LinHES-config/mv_fileshare.py b/abs/core/LinHES-config/mv_fileshare.py
new file mode 100755
index 0000000..96e9a28
--- /dev/null
+++ b/abs/core/LinHES-config/mv_fileshare.py
@@ -0,0 +1,461 @@
+# -*- coding: utf-8 -*-
+import logging, os, re
+import mv_common
+import glob
+from urllib2 import Request, urlopen, URLError, HTTPError
+#client side
+#CentralNFSallhosts=
+
+def setup_nfs_client(systemconfig,data_config):
+ nfslist=[]
+ nfsmap_serverfile ="nfsmap"
+ logging.info("____Start of setup_nfs__client____")
+ scrubnfs(systemconfig.get("TEMPLATES"))
+
+ if systemconfig.get("HaveCentralNFS") == "yes":
+ logging.debug(" Using a Central NFS server")
+ logging.debug(" NFSserver:%s" %systemconfig.get("NFSserver"))
+ if systemconfig.get("NFSserver") == "file:nfsmap":
+ #if it's a file check for it, failure results in downloading attempt from MBE
+ nfsmap_file=data_config.MYTHHOME+"/templates/nfsmap"
+ if not os.path.exists(nfsmap_file):
+ logging.debug(" Couldn't find local %s",nfsmap_file)
+ logging.info(" Trying to download nfsmap from MBE")
+ nfsmap_file = download_nfsmap(systemconfig.get("dbhost"),nfsmap_serverfile)
+ nfslist = process_nfsmap_file(nfsmap_file)
+
+ #check for other filesname:
+
+ elif re.search("^file:",systemconfig.get("NFSserver")):
+ filename=systemconfig.get("NFSserver").split(":")[1]
+ nfsmap_file=data_config.MYTHHOME+"/templates/"+filename
+ nfslist = process_nfsmap_file(nfsmap_file)
+
+ # if it's an ip parse ip and download file
+ elif re.search(":nfsmap$",systemconfig.get("NFSserver")):
+ ip=systemconfig.get("NFSserver").split(":")[0]
+ nfsmap_file = download_nfsmap(ip,nfsmap_serverfile)
+ nfslist = process_nfsmap_file(nfsmap_file)
+ #else treat it as a single mount point
+ else:
+ item = (systemconfig.get("NFSserver") , systemconfig["NFSmount"])
+ nfslist.append(item)
+ else:
+ #if frontend_only or slave try to use MBE nfs_map_auto
+ if systemconfig.get("SystemType") == "Frontend_only" or systemconfig["SystemType"] == "Slave_Backend":
+ logging.info(" Central NFS not found, trying to use MBE as nfs server")
+ nfsmap_serverfile = "nfsmap_auto"
+ ip=systemconfig.get("dbhost")
+ nfsmap_file = download_nfsmap(ip,nfsmap_serverfile)
+ nfslist = process_nfsmap_file(nfsmap_file)
+
+
+ setup_nfs_fstab(nfslist,data_config)
+ logging.info("__End of nfs\n")
+ return nfslist
+
+
+def process_nfsmap_file(mapfile):
+ logging.debug(" processing nfsmap file %s",mapfile)
+ nfslist = []
+ try:
+ f = open(mapfile,"r")
+ for line in f.readlines():
+ if line.startswith("#"):
+ continue
+ item = line.split()
+ if len(item) <= 1 :
+ continue
+ logging.debug(" %s",item)
+ nfslist.append(item)
+ except :
+ logging.critical("Couldn't read file %s, or some other error",mapfile)
+ return nfslist
+
+def scrubnfs(templates):
+ logging.info(" Scrubbing nfs")
+ mv_common.cp_and_log("/etc/fstab",templates+"/fstab.conf.template")
+ #used this sed cmd because it's clean and took me forever to figure out =)
+ cmd='''sed '/^#STARTSCRUB.*$/,/^#ENDSCRUB.*$/d' %s/fstab.conf.template > /etc/fstab''' %templates
+ mv_common.runcmd(cmd)
+
+def download_nfsmap(ip,nfsmap_serverfile):
+ nfsmap_file="/tmp/nfsmap"
+ myurl="http://%s:1337/templates/%s" %(ip,nfsmap_serverfile)
+ req = Request(myurl)
+
+ try:
+ f = urlopen(req)
+ logging.info(" downloading %s", myurl)
+ local_file = open(nfsmap_file, "w")
+ #Write to our local file
+ local_file.write(f.read())
+ local_file.close()
+ #handle errors
+ except HTTPError, e:
+ logging.info(" File download failed")
+ logging.debug(" %s", myurl)
+ logging.debug(" HTTP Error: %s", e.code)
+ except URLError, e:
+ logging.info(" File download failed")
+ logging.debug(" %s",myurl)
+ logging.debug(" URL Error: %s ", e.reason)
+
+ return nfsmap_file
+
+def setup_nfs_mkdir(nfs_dirname):
+ logging.info(" Creating NFS mount point %s" , nfs_dirname)
+ try:
+ os.makedirs(nfs_dirname)
+ except:
+ logging.debug(" Failed creating nfs mount point")
+
+
+
+
+
+def setup_nfs_fstab(nfslist,data_config):
+ logging.info(" Adding nfs paths to fstab")
+ nfs_options = mythhome = data_config.nfs_options
+ try:
+ f = open('/etc/fstab', 'a')
+ line = "#STARTSCRUB --------------anything in this block will be scrubbed\n"
+ f.write(line)
+ for s, m in nfslist:
+ line = "%s %s nfs %s \n" %(s,m,nfs_options)
+ setup_nfs_mkdir(m)
+ logging.debug(" %s",line)
+ f.write(line)
+ line = "#ENDSCRUB\n"
+ f.write(line)
+ f.close()
+
+ for s, m in nfslist:
+ logging.info(" nfs mounting %s",m)
+ cmd = ['mount',m]
+ mv_common.runcmd_bg(cmd)
+
+
+ except:
+ logging.critical(" *Couldn't open /etc/fstab for writing")
+ logging.debug(" Done adding nfs paths to fstab")
+
+
+
+
+
+#server side
+def setup_samba(systemconfig,data_config):
+ mythhome = data_config.MYTHHOME
+ excludes = data_config.share_exclude_dir
+ if systemconfig.get("UseSamba") == "1":
+ logging.info(" Activating windows file sharing")
+ usersamba=mythhome+"/templates/smb.conf"
+ mv_common.pacinstall("samba")
+ if not os.path.exists("/etc/samba"):
+ logging.debug(" Creating directory /etc/samba")
+ try:
+ os.makedirs("/etc/samba")
+ except:
+ pass
+
+ if os.path.exists(usersamba):
+ logging.debug(" Using user provided config file %s",usersamba)
+ cmd = "install -D -m755 %s /etc/samba/smb.conf" %usersamba
+ mv_common.runcmd(cmd)
+ else:
+ Samba_media = systemconfig.get("Samba_media")
+ Samba_home = systemconfig.get("Samba_home")
+ if systemconfig.get("Samba_mediareadonly") == "0":
+ smreadonly = "yes"
+ else:
+ smreadonly = "no"
+
+ if systemconfig.get("Samba_homereadonly") == "0":
+ shreadonly = "yes"
+ else:
+ shreadonly = "no"
+ domain = systemconfig.get("Samba_domain")
+ servername = systemconfig.get("hostname")
+
+ try:
+ f = open(systemconfig.get("TEMPLATES")+"/samba/smb.conf.template",'r')
+ t_smbconf = f.readlines()
+ f.close()
+ except:
+ logging.info(" Couldn't open samba template file")
+ return
+
+ try:
+ f = open("/etc/samba/smb.conf",'w')
+ except:
+ logging.info(" Couldn't open samba file")
+ return
+
+ for line in t_smbconf:
+ outline = line
+ if re.match("^.*workgroup", line):
+ logging.debug(" Setting workgroup to %s",domain)
+ outline="workgroup = %s\n" %domain
+ logging.debug(" %s",outline)
+ if re.match("^.* server string",line):
+ logging.debug(" Setting server name to %s",servername)
+ outline="server string = %s\n" %servername
+ logging.debug(" %s",outline)
+ f.write(outline)
+
+ outline="include = %s/templates/user.shares \n" %mythhome
+ f.write(outline)
+ if Samba_media == "1":
+ outline="include = /etc/samba/smb.conf.media\n"
+ f.write(outline)
+ if Samba_home == "1":
+ outline="include = /etc/samba/smb.conf.home\n"
+ f.write(outline)
+ f.close()
+
+ logging.info(" Writing smb.conf.media")
+ try:
+ f = open("/etc/samba/smb.conf.media","w")
+ except:
+ logging.info("* Couldn't open smb.conf.media")
+ return
+
+ shares = scan_for_shares()
+ medialines='''
+[%s]
+ path = %s
+ public = yes
+ only guest = yes
+ writeable = %s
+ printable = no
+ force user = mythtv
+ force group = mythtv
+ create mask = 0755\n'''
+ new_share=[]
+ excludes
+ for share in shares:
+ share_name = share.split("/")[-1]
+ share_path = share
+ #new_share.append(medialines %(share_name,share_patch,smreadonly)
+ f.write(medialines %(share_name,share_path,smreadonly) )
+ logging.debug(" %s",medialines %(share_name,share_path,smreadonly) )
+ excludeline = ' veto files = '
+ for exclude in excludes:
+ excludeline+= ''' "/%s/" ''' %exclude
+
+ if excludes != []:
+ f.write( excludeline)
+ logging.debug(excludeline)
+ f.write("\n")
+
+ f.close()
+ logging.info(" Writing smb.conf.home")
+ try:
+ f = open("/etc/samba/smb.conf.home","w")
+ except:
+ logging.info(" Couldn't open smb.conf.home")
+ return
+ homelines='''
+[home]
+path = %s
+public = yes
+only guest = yes
+writeable = %s
+printable = no
+force user = mythtv
+force group = mythtv
+create mask = 0755 ''' %(data_config.MYTHHOME,shreadonly)
+ f.write(homelines)
+ f.close()
+ logging.debug(" %s",homelines)
+
+
+ mv_common.add_service("nmbd")
+ mv_common.add_service("smbd")
+ mv_common.restart_service("nmbd")
+ mv_common.restart_service("smbd")
+
+ else:
+ logging.info(" Removing windows file sharing")
+ mv_common.remove_service("smbd")
+ mv_common.remove_service("nmbd")
+ mv_common.pacremove("samba")
+ mv_common.pacinstall("smbclient")
+ return
+
+def scan_for_shares():
+ import ConfigParser
+ config = ConfigParser.RawConfigParser()
+ file_list=glob.glob("/etc/storage.d/*.conf")
+ share_list = []
+ for conf_file in file_list:
+ try:
+ logging.debug(" mv_fileshare: reading in %s" %conf_file)
+ config.read(conf_file)
+ shareable = config.get('storage','shareable')
+ if shareable == "True" :
+ mp = config.get('storage','mountpoint')
+ share_list.append(mp)
+ if config.get('storage','mmount') == "True" :
+ share_list.append("/myth")
+ except:
+ logging.debug(" mv_fileshare: Couldn't open %s for reading" %conf_file)
+
+ return share_list
+
+def setup_etc_exports(shares,data_config,servername,nfslist):
+ #read in /etc/ exports
+ conf_file="/etc/exports"
+ excludes = data_config.share_exclude_dir
+ nfsmap_sg_auto_skip = data_config.SG_MAP_AUTONFS_SKIP
+ nfsmap_auto_skip = data_config.MAP_AUTONFS_SKIP
+
+ #print nfsmap_auto_skip
+ nfs_auto_line ="%s:%s %s"
+ nfs_map_auto = []
+ share_list = []
+
+ #populate nfs_map_auto with nfs_list. nfs_list is populated from the
+ #central nfs options
+ #nfslist looks like [('silverraid:/raid0/data/media', '/data/storage/nfs/silverraid')]
+ for i in nfslist:
+ sharename = i[0]
+ mountpoint = i[1]
+ templine = "%s %s" %(sharename,mountpoint)
+ nfs_map_auto.append(templine)
+
+
+ #create the lists for both /etc/exports and nfs_map_auto
+ for share in shares:
+ if share == "/myth":
+ continue
+ os.chdir(share)
+ file_list=glob.glob("*")
+ for dirname in file_list:
+ if os.path.isdir(dirname):
+ tempname = "%s/%s" %(share,dirname)
+ if dirname not in nfsmap_auto_skip:
+ share_list.append(tempname)
+ if dirname not in nfsmap_sg_auto_skip:
+ templine = nfs_auto_line %(servername,tempname,tempname)
+ nfs_map_auto.append(templine)
+
+
+ file_list=glob.glob("media/*")
+ for dirname in file_list:
+ if os.path.isdir(dirname):
+ tempname = "%s/%s" %(share,dirname)
+ if dirname not in nfsmap_auto_skip:
+ share_list.append(tempname)
+ if dirname not in nfsmap_sg_auto_skip:
+ templine = nfs_auto_line %(servername,tempname,tempname)
+ nfs_map_auto.append(templine)
+
+ new_exports=[]
+ new_exports.append("#This file was generated by systemconfig.py -m fileshare")
+ new_exports.append("#Use exportfs -arv to reread. \n\n")
+ #for exclude in excludes:
+ # share_line='''/%s *(noaccess)''' %exclude
+ # new_exports.append(share_line)
+
+ for share in share_list:
+ share_line='''%s *(rw,all_squash,anonuid=1000,anongid=1000,no_subtree_check)''' %share
+ new_exports.append(share_line)
+ #for exclude in excludes:
+ #share_line='''/%s *(noaccess)''' %exclude
+ #new_exports.append(share_line)
+
+ #write out nfs_map_auto
+ try:
+
+ logging.info(" writing nfsmap_auto")
+ try:
+ dirname ="%s/templates/" %data_config.MYTHHOME
+ os.makedirs(dirname)
+ cmd = "chmod 755 %s" %dirname
+ mv_common.runcmd(cmd)
+ cmd = "chown mythtv:users %s" %dirname
+ mv_common.runcmd(cmd)
+ except:
+ pass
+ try:
+ cmd = "chmod 755 %s" %dirname
+ mv_common.runcmd(cmd)
+ cmd = "chown mythtv:users %s" %dirname
+ mv_common.runcmd(cmd)
+ except:
+ pass
+ conf_file_nfs = "%s/templates/nfsmap_auto" %(data_config.MYTHHOME)
+ f=open(conf_file_nfs,'w')
+ for line in nfs_map_auto:
+ f.write(line)
+ f.write("\n")
+ logging.debug("%s" %line)
+ f.close()
+ except:
+ logging.info("* error writing %s" %conf_file_nfs)
+
+ try:
+ logging.info(" writing /etc/exports")
+ f=open(conf_file,'w')
+ for line in new_exports:
+ f.write(line)
+ f.write("\n")
+ logging.debug("%s" %line)
+ f.close()
+ except:
+ logging.info("* error writing /etc/exports")
+
+
+
+def setup_NFSshares(UseNFS,templatefile,data_config,servername,nfslist):
+ if UseNFS == "1":
+ logging.info(" Activating NFS server")
+ mv_common.pacinstall("nfs-utils")
+ mv_common.pacinstall("rpcbind")
+ shares = scan_for_shares()
+ setup_etc_exports(shares,data_config,servername,nfslist)
+ mv_common.add_service("nfsd")
+ mv_common.add_service("nfs-common")
+ mv_common.add_service("rpcbind")
+ cmd="exportfs -arv"
+ mv_common.runcmd(cmd)
+ else:
+ logging.info(" Removing NFS server")
+ mv_common.remove_service("nfsd")
+ return
+
+def setup_dyndns(DDnsEnable):
+ if DDnsEnable == "1":
+ logging.info(" Installing Dynamic DNS client")
+ mv_common.pacinstall("inadyn")
+ mv_common.add_service("inadyn")
+ else:
+ logging.info(" Removing Dynamic DNS client")
+ mv_common.pacremove("inadyn")
+ mv_common.remove_service("inadyn")
+
+
+def setup_fileshare(systemconfig,data_config):
+ if mv_common.read_config(mv_common.module_config,"fileshare") == False :
+ logging.info("____Skipping of fileshare, config disabled____")
+ return
+ logging.info("____Start of fileshare configuration____")
+
+ #client, nfslist will be used in case the central NFS needs to also be addressed
+ nfslist = setup_nfs_client(systemconfig,data_config)
+
+ #server
+ if systemconfig.get("CentralNFSallhosts") == "0":
+ #reset nfslist to 0 so that central nfsshares do not get added to auto_nfs
+ nfslist = []
+
+ setup_NFSshares(systemconfig.get("UseNFS"),
+ systemconfig.get("TEMPLATES")+"/exports.template",
+ data_config,systemconfig.get("hostname"),
+ nfslist)
+
+ setup_samba(systemconfig,data_config)
+
+ logging.info("__End of fileshare configuration\n")