From e14c6ea84f18143bbd9eb17838b28fb884e78bd3 Mon Sep 17 00:00:00 2001
From: Daniel <info@danielripoll.es>
Date: Sun, 17 Apr 2016 23:32:28 +0200
Subject: [PATCH] Feat: enable xfs-quotas. --- Daniel Ripoll I was a DevOps
 before it was cool. http://danielripoll.es +34 6688 27490

---
 .../plugins-available/apache2_plugin.inc.php  | 24 +++++++++--
 server/plugins-available/cron_plugin.inc.php  | 43 +++++++++++++------
 server/plugins-available/nginx_plugin.inc.php | 26 +++++++++--
 3 files changed, 74 insertions(+), 19 deletions(-)

diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php
index e635429193..6bc4b97b17 100644
--- a/server/plugins-available/apache2_plugin.inc.php
+++ b/server/plugins-available/apache2_plugin.inc.php
@@ -860,11 +860,29 @@ class apache2_plugin {
 			if($data['new']['hd_quota'] > 0) {
 				$blocks_soft = $data['new']['hd_quota'] * 1024;
 				$blocks_hard = $blocks_soft + 1024;
+                $mb_hard = $mb_soft + 1;
 			} else {
-				$blocks_soft = $blocks_hard = 0;
+				$mb_soft = $mb_hard = $blocks_soft = $blocks_hard = 0;
 			}
-			exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null");
-			exec('setquota -T -u '.$username.' 604800 604800 -a &> /dev/null');
+            
+          // get the primitive folder for document_root and the filesystem, will need it later.
+          $df_output=exec("df -T $document_root|awk 'END{print \$2,\$NF}'");
+          $file_system = explode(" ", $df_output)[0];
+          $primitive_root = explode(" ", $df_output)[1];
+
+          if ( $file_system , array('ext2','ext3','ext4') ) {
+            exec('setquota -u '. $username . ' ' . $blocks_soft . ' ' . $blocks_hard . ' 0 0 -a &> /dev/null');
+            exec('setquota -T -u '.$username.' 604800 604800 -a &> /dev/null');
+          } elseif ($file_system == 'xfs') {
+
+            exec("xfs_quota -x -c 'limit -g bsoft=$mb_soft" . 'm'. " bhard=$mb_hard" . 'm'. " $username' $primitive_root");
+
+            // xfs only supports timers globally, not per user.
+            exec("xfs_quota -x -c 'timer -bir -i 604800'");
+
+            unset($project_uid, $username_position, $xfs_projects);
+            unset($primitive_root, $df_output, $mb_hard, $mb_soft);
+          }
 		}
 
 		if($this->action == 'insert' || $data["new"]["system_user"] != $data["old"]["system_user"]) {
diff --git a/server/plugins-available/cron_plugin.inc.php b/server/plugins-available/cron_plugin.inc.php
index 7d3c1383e0..f638166d56 100644
--- a/server/plugins-available/cron_plugin.inc.php
+++ b/server/plugins-available/cron_plugin.inc.php
@@ -123,18 +123,37 @@ class cron_plugin {
 			exec("useradd -d ".escapeshellcmd($parent_domain["document_root"])." -g $groupname $username -s /bin/false");
 			$app->log("Adding the user: $username", LOGLEVEL_DEBUG);
 		}
-
-		// Set the quota for the user
-		if($username != '' && $app->system->is_user($username)) {
-			if($parent_domain["hd_quota"] > 0){
-				$blocks_soft = $parent_domain["hd_quota"] * 1024;
-				$blocks_hard = $blocks_soft + 1024;
-			} else {
-				$blocks_soft = $blocks_hard = 0;
-			}
-			exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null");
-			exec("setquota -T -u $username 604800 604800 -a &> /dev/null");
-		}
+        
+        // Set the quota for the user
+        if($username != '' && $app->system->is_user($username)) {
+           if($parent_domain['hd_quota'] > 0) {
+              $blocks_soft = $parent_domain['hd_quota'] * 1024;
+              $mb_soft = $parent_domain['hd_quota'];
+              $blocks_hard = $blocks_soft + 1024;
+              $mb_hard = $mb_soft + 1;
+            } else {
+              $mb_soft = $mb_hard = $blocks_soft = $blocks_hard = 0;
+            }
+
+            // get the primitive folder for document_root and the filesystem, will need it later.
+            $df_output=exec("df -T $document_root|awk 'END{print \$2,\$NF}'");
+            $file_system = explode(" ", $df_output)[0];
+            $primitive_root = explode(" ", $df_output)[1];
+
+            if ( $file_system , array('ext2','ext3','ext4') ) {
+              exec('setquota -u '. $username . ' ' . $blocks_soft . ' ' . $blocks_hard . ' 0 0 -a &> /dev/null');
+              exec('setquota -T -u '.$username.' 604800 604800 -a &> /dev/null');
+            } elseif ($file_system == 'xfs') {
+                
+              exec("xfs_quota -x -c 'limit -g bsoft=$mb_soft" . 'm'. " bhard=$mb_hard" . 'm'. " $username' $primitive_root");
+
+              // xfs only supports timers globally, not per user.
+              exec("xfs_quota -x -c 'timer -bir -i 604800'");
+
+              unset($project_uid, $username_position, $xfs_projects);
+              unset($primitive_root, $df_output, $mb_hard, $mb_soft);
+            }
+        }
 
 		//TODO : change this when distribution information has been integrated into server record
 		//* Gentoo requires a user to be part of the crontab group.
diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php
index c2b2abf886..92c6efb413 100644
--- a/server/plugins-available/nginx_plugin.inc.php
+++ b/server/plugins-available/nginx_plugin.inc.php
@@ -715,15 +715,33 @@ class nginx_plugin {
 		}  // end copy error docs
 
 		// Set the quota for the user, but only for vhosts, not vhostsubdomains or vhostalias
-		if($username != '' && $app->system->is_user($username) && $data['new']['type'] == 'vhost') {
+	    if($username != '' && $app->system->is_user($username) && $data['new']['type'] == 'vhost') {
 			if($data['new']['hd_quota'] > 0) {
 				$blocks_soft = $data['new']['hd_quota'] * 1024;
 				$blocks_hard = $blocks_soft + 1024;
+                $mb_hard = $mb_soft + 1;
 			} else {
-				$blocks_soft = $blocks_hard = 0;
+				$mb_soft = $mb_hard = $blocks_soft = $blocks_hard = 0;
 			}
-			exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null");
-			exec('setquota -T -u '.$username.' 604800 604800 -a &> /dev/null');
+            
+          // get the primitive folder for document_root and the filesystem, will need it later.
+          $df_output=exec("df -T $document_root|awk 'END{print \$2,\$NF}'");
+          $file_system = explode(" ", $df_output)[0];
+          $primitive_root = explode(" ", $df_output)[1];
+
+          if ( $file_system , array('ext2','ext3','ext4') ) {
+            exec('setquota -u '. $username . ' ' . $blocks_soft . ' ' . $blocks_hard . ' 0 0 -a &> /dev/null');
+            exec('setquota -T -u '.$username.' 604800 604800 -a &> /dev/null');
+          } elseif ($file_system == 'xfs') {
+
+            exec("xfs_quota -x -c 'limit -g bsoft=$mb_soft" . 'm'. " bhard=$mb_hard" . 'm'. " $username' $primitive_root");
+
+            // xfs only supports timers globally, not per user.
+            exec("xfs_quota -x -c 'timer -bir -i 604800'");
+
+            unset($project_uid, $username_position, $xfs_projects);
+            unset($primitive_root, $df_output, $mb_hard, $mb_soft);
+          }
 		}
 
 		if($this->action == 'insert' || $data["new"]["system_user"] != $data["old"]["system_user"]) {
-- 
GitLab