[Cluster-devel] conga/ricci/modules/storage ContentFS.cpp Cont ...

kupcevic at sourceware.org kupcevic at sourceware.org
Tue Sep 26 03:02:59 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	kupcevic at sourceware.org	2006-09-26 03:02:57

Modified files:
	ricci/modules/storage: ContentFS.cpp ContentFS.h ExtendedFS.cpp 
	                       ExtendedFS.h FSController.cpp Props.cpp 
	                       Props.h SwapFS.cpp SwapFS.h defines.h 

Log message:
	storage module:
	- unify mount handling
	- add pretty names to filesystem types

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/ContentFS.cpp.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/ContentFS.h.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/ExtendedFS.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/ExtendedFS.h.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/FSController.cpp.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/Props.cpp.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/Props.h.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/SwapFS.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/SwapFS.h.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/defines.h.diff?cvsroot=cluster&r1=1.5&r2=1.6

--- conga/ricci/modules/storage/ContentFS.cpp	2006/08/10 22:53:09	1.3
+++ conga/ricci/modules/storage/ContentFS.cpp	2006/09/26 03:02:57	1.4
@@ -27,17 +27,23 @@
 #include "ContentNone.h"
 #include "BDFactory.h"
 #include "defines.h"
+#include "utils.h"
 
 
 using namespace std;
 
 
-ContentFS::ContentFS(const String& fs_name, const String& path) :
+#define ILLEGAL_MOUNT_CHARS   String(" <>?'\":;|}]{[)(*&^%$#@!~`+=")
+
+
+
+ContentFS::ContentFS(const String& path, 
+		     const String& name, 
+		     const String& module) :
   Content(CONTENT_FS_TYPE, path),
-  _name(fs_name)
-{
-  
-}
+  _name(name),
+  _module(module)
+{}
 
 ContentFS::~ContentFS()
 {}
@@ -85,7 +91,6 @@
 }
 
 
-
 XMLObject
 ContentFS::xml() const
 {
@@ -97,13 +102,185 @@
 
 
 
+void 
+ContentFS::mount_props_probe(const String& path,
+			     const String& fsname,
+			     Props& props)
+{
+  FstabLocker l;
+  MountHandler mh;
+  
+  // mountpoint
+  pair<unsigned int, unsigned int> maj_min = mh.maj_min(path);
+  list<Mountpoint> mounts = mh.mounts(maj_min);
+  String mountpoint;
+  if (mounts.size())
+    mountpoint = mounts.front().mountpoint;
+  list<String> ill_mnts = mh.used_dirs();
+  ill_mnts.remove(mountpoint);
+  // fstab
+  list<Mountpoint> fstabs = mh.fstabs(maj_min);
+  String fstabpoint;
+  if (fstabs.size())
+    fstabpoint = fstabs.front().mountpoint;
+  ill_mnts.remove(fstabpoint);
+  
+  
+  
+  bool mountable = mount_fs_supported(fsname);
+  props.set(Variable("mountable", mountable));
+  if (mountable)
+    props.set(Variable("mountpoint", 
+		       mountpoint, 
+		       0, 
+		       128, 
+		       ILLEGAL_MOUNT_CHARS, 
+		       ill_mnts));
+  if (mountable ||
+      !fstabpoint.empty())
+    props.set(Variable("fstabpoint", 
+		       fstabpoint, 
+		       0, 
+		       128, 
+		       ILLEGAL_MOUNT_CHARS, 
+		       ill_mnts));
+}
+
+void 
+ContentFS::mount_props_apply(const String& path,
+			     const String& fsname,
+			     const Props& old_props,
+			     const Props& new_props)
+{
+  FstabLocker l;
+  
+  // mountpoint
+  if (old_props.has("mountpoint")) {
+    String mnt_curr = old_props.get("mountpoint").get_string();
+    String mnt_new = new_props.get("mountpoint").get_string();
+    if (mnt_curr != mnt_new) {
+      MountHandler mh;
+      if (mnt_curr.size())
+	if (!mh.umount(path, mnt_curr))
+	  throw UMountError(mnt_curr);
+      if (mnt_new.size())
+	if (!mh.mount(path, mnt_new, fsname))
+	  throw String("mount failed");
+    }
+  }
+  
+  // fstab
+  if (old_props.has("fstabpoint")) {
+    String mnt_curr = old_props.get("fstabpoint").get_string();
+    String mnt_new = new_props.get("fstabpoint").get_string();
+    if (mnt_curr != mnt_new) {
+      MountHandler mh;
+      if (mnt_curr.size()) {
+	list<Mountpoint> l = mh.fstabs(mh.maj_min(path));
+	for (list<Mountpoint>::const_iterator iter = l.begin();
+	     iter != l.end();
+	     iter++)
+	  if (iter->mountpoint == mnt_curr)
+	    mh.fstab_remove(iter->devname, mnt_curr);
+      }
+      if (mnt_new.size())
+	mh.fstab_add(path, mnt_new, fsname);
+    }
+  }
+}
+
+bool 
+ContentFS::mount_props_mounted(const Props& props)
+{
+  if (props.has("mountpoint"))
+    return props.get("mountpoint").get_string().size();
+  return false;
+}
+
+
+
+
+  
+
+
+
 
 ContentFSTemplate::ContentFSTemplate(const String& name) :
   ContentTemplate(CONTENT_FS_TYPE),
-  name(name)
+  _name(name)
 {
-  attrs["fs_type"] = name;
+  attrs["fs_type"] = _name;
 }
 
 ContentFSTemplate::~ContentFSTemplate()
 {}
+
+
+
+void 
+ContentFSTemplate::mount_props_template(const String& fsname,
+					Props& props)
+{
+  bool mountable = ContentFS::mount_fs_supported(fsname);
+  props.set(Variable("mountable", mountable));
+  
+  if (mountable) {
+    list<String> illegal_mps = MountHandler().used_dirs();
+    props.set(Variable("mountpoint", 
+		       "", 
+		       0, 
+		       128, 
+		       ILLEGAL_MOUNT_CHARS, 
+		       illegal_mps));
+    props.set(Variable("fstab", false, true));
+    props.set(Variable("mount", false, true));
+  }
+}
+
+void 
+ContentFSTemplate::mount_props_create(const String& path,
+				      const String& fsname,
+				      const Props& props)
+{
+  if (props.has("mountpoint")) {
+    String mountpoint = props.get("mountpoint").get_string();
+    String label;
+    try {
+      label = props.get("label").get_string();
+    } catch ( ... ) {}
+    bool mount = props.get("mount").get_bool();
+    bool fstab = props.get("fstab").get_bool();
+    
+    if (mountpoint.size()) {
+      FstabLocker l;
+      if (mount)
+	MountHandler().mount(path, 
+			     mountpoint,
+			     fsname);
+      if (fstab)
+	MountHandler().fstab_add(label.empty() ? path : String("LABEL=") + label, 
+				 mountpoint,
+				 fsname);
+    }
+  }
+}
+
+
+
+
+
+bool
+ContentFS::mount_fs_supported(const String& fsname)
+{
+  list<String> l = MountHandler().fstypes();
+  if (find(l.begin(), l.end(), fsname) != l.end())
+    return true;
+  
+  String out, err;
+  int status;
+  vector<String> args;
+  args.push_back(fsname);
+  if (utils::execute("/sbin/modinfo", args, out, err, status))
+    throw String("execute failed");
+  return !status;
+}
--- conga/ricci/modules/storage/ContentFS.h	2006/08/10 22:53:09	1.5
+++ conga/ricci/modules/storage/ContentFS.h	2006/09/26 03:02:57	1.6
@@ -28,6 +28,9 @@
 #include "String.h"
 
 
+#define ILLEGAL_LABEL_CHARS    String(" <>?'\":;|}]{[)(*&^%$#@!~`+=")
+
+
 class ContentFS : public Content
 {
  public:
@@ -39,11 +42,23 @@
   virtual void remove();
   
   
- protected:
-  ContentFS(const String& name, const String& path);
-  String _name;
+  
+  static bool mount_fs_supported(const String& fsname); // true if mountable
+  // these fcns extract/place info from/into props
+  static bool mount_props_mounted(const Props& props); // true if mounted
+  static void mount_props_probe(const String& path,
+				const String& module,
+				Props& props);
+  static void mount_props_apply(const String& path,
+				const String& module,
+				const Props& old_props,
+				const Props& new_props);
   
   
+ protected:
+  ContentFS(const String& path, const String& name, const String& module);
+  String _name;
+  String _module;
   
 };
 
@@ -53,9 +68,16 @@
  public:
   virtual ~ContentFSTemplate();
   
+  static void mount_props_template(const String& module,
+				   Props &props);
+  static void mount_props_create(const String& path,
+				 const String& module,
+				 const Props &props);
+  
+  
  protected:
   ContentFSTemplate(const String& name);
-  String name;
+  String _name;
   
   
 };
--- conga/ricci/modules/storage/ExtendedFS.cpp	2006/09/14 17:52:04	1.4
+++ conga/ricci/modules/storage/ExtendedFS.cpp	2006/09/26 03:02:57	1.5
@@ -24,7 +24,6 @@
 #include "ExtendedFS.h"
 #include "utils.h"
 #include "MountHandler.h"
-#include "defines.h"
 #include "UMountError.h"
 #include "FileMagic.h"
 
@@ -33,20 +32,21 @@
 using namespace std;
 
 
-
-
-
+const static String MKE2FS_path("/sbin/mke2fs");
+const String ExtendedFS::PRETTY_NAME("Linux Extended FS");
 
 
 
 ExtendedFS::ExtendedFS(const String& path) :
-  ContentFS("extended_fs", path),
+  ContentFS(path, 
+	    PRETTY_NAME,
+	    "ext2"),
   _journaled(false)
 {
   String magic(FileMagic::get_description(path));
   if (magic.find("ext3") == magic.npos && 
       magic.find("ext2") == magic.npos)
-    throw String(path + " not extended_fs");
+    throw path + ": not an " + _name;
   
   // dumpe2fs
   String out, err;
@@ -95,36 +95,27 @@
 	String label = words[3];
 	if (label == "<none>")
 	  label.clear();
-	//	_props.set(Variable("label", label, 0, 16, illegal_label_chars, list<String>()));
+	//	_props.set(Variable("label", label, 0, 16, ILLEGAL_LABEL_CHARS, list<String>()));
 	_props.set(Variable("label", label));
       }
     }
   }
   
-  // mountpoint
-  MountHandler mh;
-  pair<unsigned int, unsigned int> maj_min = mh.maj_min(path);
-  list<Mountpoint> mounts = mh.mounts(maj_min);
-  String mountpoint;
-  if (mounts.size())
-    mountpoint = mounts.front().mountpoint;
-  list<String> ill_mnts = mh.used_dirs();
-  ill_mnts.remove(mountpoint);
-  // fstab
-  list<Mountpoint> fstabs = mh.fstabs(maj_min);
-  String fstabpoint;
-  if (fstabs.size())
-    fstabpoint = fstabs.front().mountpoint;
-  ill_mnts.remove(fstabpoint);
+  long long block_count = _props.get("block_count").get_int();
   
-  _props.set(Variable("mountpoint", mountpoint, 0, 128, ";? *!", ill_mnts));
-  _props.set(Variable("fstabpoint", fstabpoint, 0, 128, ";? *!", ill_mnts));
+  if (_journaled)
+    _module = "ext3";
+  else
+    _module = "ext2";
   
   // journaling
-  long long block_count = _props.get("block_count").get_int();
   _props.set(Variable("has_journal", 
 		      _journaled, 
 		      (!_journaled && block_count > 1024)));
+  
+  mount_props_probe(path, 
+		    _module, 
+		    _props);
 }
 
 ExtendedFS::~ExtendedFS()
@@ -134,7 +125,7 @@
 bool 
 ExtendedFS::expandable(long long& max_size) const
 {
-  bool mounted = _props.get("mountpoint").get_string().size();
+  bool mounted = mount_props_mounted(_props);
   
   long long bs = _props.get("block_size").get_int();
   long long bc = _props.get("block_count").get_int();
@@ -197,7 +188,7 @@
   bool index_new = new_props.get("dir_index").get_bool();
   if (index_old != index_new) {
     vector<String> args;
-    String out, err, bin = "/sbin/tune2fs";
+    String out, err, bin("/sbin/tune2fs");
     int status;
     if (!index_old && index_new) {
       args.push_back("-O");
@@ -257,8 +248,8 @@
 void
 ExtendedFS::enable_journal(const String& path)
 {
-  MountHandler mh;
   FstabLocker lock;
+  MountHandler mh;
   
   list<Mountpoint> mounts = mh.mounts(mh.maj_min(path));
   list<Mountpoint> fstabs = mh.fstabs(mh.maj_min(path));
@@ -276,7 +267,7 @@
     
     // add journal
     vector<String> args;
-    String out, err, bin = "/sbin/tune2fs";
+    String out, err, bin("/sbin/tune2fs");
     int status;
     args.push_back("-j");
     args.push_back(path);
@@ -284,12 +275,14 @@
       throw String("execute failed");
     if (status)
       throw bin + " failed";
+    _module = "ext3";
+    
   } catch ( ... ) {
     for (list<Mountpoint>::const_iterator iter = rollback.begin();
 	 iter != rollback.end();
 	 iter++)
       try {
-	mh.mount(iter->devname, iter->mountpoint, "ext2");
+	mh.mount(iter->devname, iter->mountpoint, _module);
       } catch ( ... ) {}
     throw;
   }
@@ -299,14 +292,14 @@
        iter != fstabs.end();
        iter++) {
     mh.fstab_remove(iter->devname, iter->mountpoint);
-    mh.fstab_add(iter->devname, iter->mountpoint, "ext3");
+    mh.fstab_add(iter->devname, iter->mountpoint, _module);
   }
   
   // mount
   for (list<Mountpoint>::const_iterator iter = mounts.begin();
        iter != mounts.end();
        iter++)
-    if (!mh.mount(iter->devname, iter->mountpoint, "ext3"))
+    if (!mh.mount(iter->devname, iter->mountpoint, _module))
       throw String("mount failed");
 }
 
@@ -316,37 +309,10 @@
 				     unsigned long long new_size, 
 				     const Props& new_props)
 {
-  FstabLocker l;
-  
-  // mountpoint
-  String mnt_curr = _props.get("mountpoint").get_string();
-  String mnt_new = new_props.get("mountpoint").get_string();
-  if (mnt_curr != mnt_new) {
-    MountHandler mh;
-    if (mnt_curr.size())
-      if (!mh.umount(path, mnt_curr))
-	throw UMountError(mnt_curr);
-    if (mnt_new.size())
-      if (!mh.mount(path, mnt_new, "ext3"))
-	throw String("mount failed");
-  }
-  
-  // fstab mountpoint
-  mnt_curr = _props.get("fstabpoint").get_string();
-  mnt_new = new_props.get("fstabpoint").get_string();
-  if (mnt_curr != mnt_new) {
-    MountHandler mh;
-    if (mnt_curr.size()) {
-      list<Mountpoint> l = mh.fstabs(mh.maj_min(path));
-      for (list<Mountpoint>::const_iterator iter = l.begin();
-	   iter != l.end();
-	   iter++)
-	if (iter->mountpoint == mnt_curr)
-	  mh.fstab_remove(iter->devname, mnt_curr);
-    }
-    if (mnt_new.size())
-      mh.fstab_add(path, mnt_new, "ext3");
-  }
+  mount_props_apply(path,
+		    _module, 
+		    _props,
+		    new_props);
 }
 
 bool 
@@ -365,9 +331,6 @@
 {
   String label = templ->_props.get("label").get_string();
   String bs = utils::to_string(templ->_props.get("block_size").get_int());
-  String mountpoint = templ->_props.get("mountpoint").get_string();
-  bool mount = templ->_props.get("mount").get_bool();
-  bool fstab = templ->_props.get("fstab").get_bool();
   bool dir_index = templ->_props.get("dir_index").get_bool();
   bool has_journal = templ->_props.get("has_journal").get_bool();
   
@@ -388,43 +351,43 @@
     args.push_back("-j");
   args.push_back(path);
   
-  String out, err, bin("/sbin/mke2fs");
+  String out, err;
   int status;
-  if (utils::execute(bin, args, out, err, status))
+  if (utils::execute(MKE2FS_path, args, out, err, status))
     throw String("execute failed");
   if (status != 0)
-    throw bin + " failed";
+    throw MKE2FS_path + " failed";
   
-  String fstype = (has_journal) ? "ext3" : "ext2";
-  if (mountpoint.size()) {
-    if (mount)
-      MountHandler().mount(path, 
-			   mountpoint,
-			   fstype);
-    if (fstab)
-      MountHandler().fstab_add(label.empty() ? path : String("LABEL=") + label, 
-			       mountpoint,
-			       fstype);
-  }
+  // mountpoints
+  ContentFSTemplate::mount_props_create(path,
+					(has_journal) ? "ext3" : "ext2",
+					templ->_props);
 }
 
 ExtendedFSTemplate::ExtendedFSTemplate() :
-  ContentFSTemplate("extended_fs")
+  ContentFSTemplate(ExtendedFS::PRETTY_NAME)
 {
-  // label
-  _props.set(Variable("label", "", 0, 16, illegal_label_chars, list<String>()));
+  if (access(MKE2FS_path.c_str(), X_OK|R_OK))
+    throw String("no mke2fs exists");
+  
+  bool ext3_supported = ContentFS::mount_fs_supported("ext3");
+  
+  _props.set(Variable("label", 
+		      "", 
+		      0, 
+		      16, 
+		      ILLEGAL_LABEL_CHARS, 
+		      list<String>()));
   
-  // dir_index
   _props.set(Variable("dir_index", true, true));
   
-  // has_journal
-  _props.set(Variable("has_journal", true, true));
+  _props.set(Variable("has_journal", 
+		      ext3_supported, 
+		      ext3_supported));
   
-  // mountpoint
-  list<String> illegal_mps = MountHandler().used_dirs();
-  _props.set(Variable("mountpoint", "", 0, 128, ";? *!", illegal_mps));
-  _props.set(Variable("fstab", false, true));
-  _props.set(Variable("mount", false, true));
+  mount_props_template(ext3_supported ? "ext3" : "ext2", 
+		       _props);
+    
   
   // block_size
   list<long long> b_sizes;
--- conga/ricci/modules/storage/ExtendedFS.h	2006/08/10 22:53:09	1.3
+++ conga/ricci/modules/storage/ExtendedFS.h	2006/09/26 03:02:57	1.4
@@ -38,6 +38,7 @@
   ExtendedFS(const String& path);
   virtual ~ExtendedFS();
   
+  const static String PRETTY_NAME;
   
   virtual bool expandable(long long& max_size) const;
   virtual bool shrinkable(long long& min_size) const;
--- conga/ricci/modules/storage/FSController.cpp	2006/08/10 22:53:09	1.5
+++ conga/ricci/modules/storage/FSController.cpp	2006/09/26 03:02:57	1.6
@@ -39,14 +39,9 @@
   try {
     return counting_auto_ptr<Content>(new SwapFS(path));
   } catch ( ... ) {}
-  try {
-    //    return counting_auto_ptr<ContentFS>(new gfs(path));
-  } catch ( ... ) {}
   throw String("not FS");
-  
 }
 
-
 std::list<counting_auto_ptr<ContentTemplate> > 
 FSController::get_available_fss()
 {
@@ -58,9 +53,6 @@
   try {
     cnts.push_back(counting_auto_ptr<ContentTemplate>(new SwapFSTemplate()));
   } catch ( ... ) {}
-  try {
-    //    return counting_auto_ptr<ContentTemplate>(new gfsTemplate(path));
-  } catch ( ... ) {}
   
   return cnts;
 }
@@ -73,9 +65,9 @@
     throw String("content_template not of filesystem type");
   
   String fs_type = cont_templ->attrs["fs_type"];
-  if (fs_type == "extended_fs")
+  if (fs_type == ExtendedFS::PRETTY_NAME)
     create_extended_fs(bd->path(), cont_templ);
-  else if (fs_type == "swap")
+  else if (fs_type == SwapFS::PRETTY_NAME)
     create_swap_fs(bd->path(), cont_templ);
   else
     throw String("unknown fs type \"") + fs_type + "\"";
--- conga/ricci/modules/storage/Props.cpp	2006/09/26 01:04:20	1.3
+++ conga/ricci/modules/storage/Props.cpp	2006/09/26 03:02:57	1.4
@@ -51,6 +51,12 @@
 {}
 
 
+bool 
+Props::has(const String& name) const
+{
+  return _vars.find(name) != _vars.end();
+}
+
 const Variable 
 Props::get(const String& name) const
 {
--- conga/ricci/modules/storage/Props.h	2006/09/26 01:04:20	1.3
+++ conga/ricci/modules/storage/Props.h	2006/09/26 03:02:57	1.4
@@ -40,8 +40,9 @@
   Props(const XMLObject&);
   virtual ~Props();
   
-  const Variable get(const String& name) const;
   void set(const Variable& var);
+  bool has(const String& name) const;
+  const Variable get(const String& name) const;
   
   bool is_active(const Variable& var) const;
   
--- conga/ricci/modules/storage/SwapFS.cpp	2006/09/14 17:52:04	1.4
+++ conga/ricci/modules/storage/SwapFS.cpp	2006/09/26 03:02:57	1.5
@@ -31,8 +31,11 @@
 using namespace std;
 
 
+const String SwapFS::PRETTY_NAME("Swap");
+
+
 SwapFS::SwapFS(const String& path) :
-  ContentFS("swap", path)
+  ContentFS(path, PRETTY_NAME, "swap")
 {
   String magic(FileMagic::get_description(path));
   if (magic.find("swap") == magic.npos)
@@ -177,7 +180,12 @@
   ContentFSTemplate("swap")
 {
   // label
-  _props.set(Variable("label", "", 0, 16, illegal_label_chars, list<String>()));
+  _props.set(Variable("label", 
+		      "", 
+		      0, 
+		      16, 
+		      ILLEGAL_LABEL_CHARS, 
+		      list<String>()));
   
   // swapon
   _props.set(Variable("swapon", true, true));
--- conga/ricci/modules/storage/SwapFS.h	2006/08/10 22:53:09	1.3
+++ conga/ricci/modules/storage/SwapFS.h	2006/09/26 03:02:57	1.4
@@ -39,6 +39,7 @@
   SwapFS(const String& path);
   virtual ~SwapFS();
   
+  const static String PRETTY_NAME;
   
   virtual bool expandable(long long& max_size) const;
   virtual bool shrinkable(long long& min_size) const;
--- conga/ricci/modules/storage/defines.h	2006/08/10 22:53:09	1.5
+++ conga/ricci/modules/storage/defines.h	2006/09/26 03:02:57	1.6
@@ -27,9 +27,6 @@
 #include "String.h"
 
 
-static String illegal_label_chars("| \\ /?.,");
-
-
 
 // XML tags for various objects
 




More information about the Cluster-devel mailing list