mirror of
				https://git.lapiole.org/dani/ansible-roles.git
				synced 2025-10-27 00:41:35 +01:00 
			
		
		
		
	
		
			
	
	
		
			66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/usr/bin/perl -w | ||
|  | 
 | ||
|  | use JSON; | ||
|  | use Term::ReadKey; | ||
|  | use File::Which; | ||
|  | 
 | ||
|  | my $pvesh = which('pvesh'); | ||
|  | 
 | ||
|  | # Are we using the new pvesh for which we have to specify the output format ? | ||
|  | my $pvesh_opt = (system("$pvesh get /version --output-format=json >/dev/null 2>&1") == 0) ? '--output-format=json' : ''; | ||
|  | 
 | ||
|  | # Get a list of every iSCSI storages defined on the cluster | ||
|  | my $stor_iscsi = from_json(qx($pvesh get storage --type=iscsi $pvesh_opt 2>/dev/null)); | ||
|  | my @luks_dev = (); | ||
|  | 
 | ||
|  | # Now, check if it's encrypted using luks | ||
|  | foreach my $stor (@{$stor_iscsi}){ | ||
|  |   push @luks_dev, $stor if (is_luks(dev_from_stor($stor))); | ||
|  | } | ||
|  | 
 | ||
|  | # If we have at least one device, we must ask for the password to unlock | ||
|  | if (scalar @luks_dev gt 0){    | ||
|  |   ReadMode( "noecho"); | ||
|  |   print "Enter the password to unlock encrypted devices :"; | ||
|  |   chomp (my $pwd = <>); | ||
|  |   print "\n"; | ||
|  |   ReadMode ("original"); | ||
|  |   foreach my $stor (@luks_dev){ | ||
|  |     open $cmd,'|-', '/sbin/cryptsetup', 'open', '--type=luks', dev_from_stor($stor), $stor->{storage}, '--key-file=-'; | ||
|  |     print $cmd $pwd; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | # Return 1 if the device is a luks container | ||
|  | sub is_luks { | ||
|  |   my $dev = shift; | ||
|  |   my $blkid = qx(/sbin/blkid $dev); | ||
|  |   my $type = 'unknown'; | ||
|  |   if ($blkid =~ m/TYPE="(\w+)"/){ | ||
|  |     $type = $1; | ||
|  |   } | ||
|  |   return ($type eq 'crypto_LUKS') ? 1 : 0; | ||
|  | } | ||
|  | 
 | ||
|  | # Return the device node from the JSON storage object | ||
|  | sub dev_from_stor { | ||
|  |   my $stor = shift; | ||
|  |   my $dev = ''; | ||
|  |   if ($stor->{type} eq 'iscsi'){ | ||
|  |     my $portal = ($stor->{portal} =~ m/:(\d+)$/) ? $stor->{portal} : $stor->{portal} . ':3260'; | ||
|  |     $dev = '/dev/disk/by-path/ip-' . $portal . '-iscsi-' . $stor->{target} . '-lun-0'; | ||
|  |   } | ||
|  |   return $dev; | ||
|  | } | ||
|  | 
 | ||
|  | # If ocfs2 is used, o2cb must be restarted as it's started too early to setup everything correctly | ||
|  | #if (-e '/etc/init.d/o2cb'){ | ||
|  | #  print "Restarting o2cb and mounting other filesystems"; | ||
|  | #  system('/bin/systemctl', 'restart', 'o2cb'); | ||
|  | #  sleep 20; | ||
|  | #  system('/bin/mount', '-a'); | ||
|  | #  # Not sure why but OCFS2 seems to fail on first mount | ||
|  | #  system('/bin/mount', '-a'); | ||
|  | #  print "\n"; | ||
|  | #} |