pdbedit - Export to LDIF

Julius Enarusai enarusai at us.ibm.com
Wed Jun 2 18:24:37 GMT 2004


Julius Enarusai wrote:

> Alexander Bokovoy wrote:
>
>> On Wed, Jun 02, 2004 at 01:03:45PM -0400, Julius Enarusai wrote:
>>  
>>
>>>>> file in /tmp directory. Any comments will be appreciated.
>>>>>       
>>>>
>>>> Why in /tmp? Would stdout be a better target?
>>>>     
>>>
>>> The idea was to export to a file that can be used as input to the 
>>> slapadd bulk-load tool. However, stdout can be an alternative.
>>>   
>>
>> In fact, slapadd accepts standard input if option -l isn't specified.
>> So you don't need to default to something in /tmp -- defaulting to 
>> stdout
>> is a common POSIX concept.
>>
>>
>>  
>>
> No problem. Will submit an updated patch that will send output to 
> stdout, if file name is not specified.
>
Updated patch to default to stdout if LDIF file is not specified.
-------------- next part --------------
Index: utils/pdbedit.c
===================================================================
--- utils/pdbedit.c	(revision 773)
+++ utils/pdbedit.c	(working copy)
@@ -49,6 +49,8 @@
 #define BIT_EXPORT	0x02000000
 #define BIT_FIX_INIT    0x04000000
 #define BIT_BADPWRESET	0x08000000
+#define BIT_EXPORT_LDIF	0x10000000
+#define BIT_LDIF_FILE_NAME	0x20000000
 
 #define MASK_ALWAYS_GOOD	0x0000001F
 #define MASK_USER_GOOD		0x00401F00
@@ -594,6 +596,130 @@
 }
 
 /*********************************************************
+ Print ldif info from sam structure
+ **********************************************************/
+static int print_ldif_info (SAM_ACCOUNT *sam_pwent, char *suffix, FILE *ldif)
+{
+    uid_t uid;
+    uid_t gid;
+    uint32 tmp;
+	char *tmp_str;
+
+	/* TODO: chaeck if entry is a user or a workstation */ 
+
+	if (!sam_pwent) return -1;
+
+	uid = nametouid(pdb_get_username(sam_pwent));
+	gid = nametogid(pdb_get_username(sam_pwent));
+	fprintf (ldif, "dn: uid=%s,%s\n", pdb_get_username(sam_pwent), suffix);
+	fprintf (ldif, "objectclass: top\n"); 
+	fprintf (ldif, "objectclass: inetOrgPerson\n"); 
+	fprintf (ldif, "objectclass: posixAccount\n"); 
+	fprintf (ldif, "objectclass: sambaSamAccount\n");
+	fprintf (ldif, "uid: %s\n", pdb_get_username(sam_pwent));
+	fprintf (ldif, "uidNumber: %lu\n", (unsigned long)uid);
+	fprintf (ldif, "gidNumber: %lu\n", (unsigned long)gid); 
+
+	tmp_str = pdb_get_plaintext_passwd(sam_pwent);
+	fprintf (ldif, "userPassword: %s\n", tmp_str ? tmp_str : "{crypt}x");
+
+	fprintf (ldif, "sambaAcctFlags: %s\n", pdb_encode_acct_ctrl(pdb_get_acct_ctrl(sam_pwent), NEW_PW_FORMAT_SPACE_PADDED_LEN));
+	fprintf (ldif, "sambaSID: %s\n",
+		sid_string_static(pdb_get_user_sid(sam_pwent)));
+	fprintf (ldif, "sambaPrimaryGroupSID: %s\n",
+		sid_string_static(pdb_get_group_sid(sam_pwent)));
+	fprintf (ldif, "cn: %s\n", pdb_get_fullname(sam_pwent));
+	fprintf (ldif, "sn: %s\n", pdb_get_fullname(sam_pwent));
+	fprintf (ldif, "displayName: %s\n", pdb_get_fullname(sam_pwent));
+	fprintf (ldif, "homeDirectory: %s\n", pdb_get_homedir(sam_pwent));
+	fprintf (ldif, "sambaHomePath: %s\n", pdb_get_homedir(sam_pwent) );
+
+	tmp_str = pdb_get_dir_drive(sam_pwent);
+	if( tmp_str && strlen(tmp_str) > 0)
+		fprintf (ldif, "sambaHomeDrive: %s\n", tmp_str );
+
+	tmp_str = pdb_get_logon_script(sam_pwent);
+	if(tmp_str && strlen(tmp_str) > 0)
+		fprintf (ldif, "sambaLogonScript: %s\n", tmp_str );
+
+	tmp_str = pdb_get_profile_path(sam_pwent);
+	if(tmp_str && strlen(tmp_str) > 0)
+		fprintf (ldif, "sambaProfilePath: %s\n", tmp_str);
+
+	fprintf (ldif, "sambaDomainName: %s\n", pdb_get_domain(sam_pwent));
+
+	tmp_str = pdb_get_acct_desc(sam_pwent);
+	if(tmp_str && strlen(tmp_str) > 0)
+		fprintf (ldif, "description: %s\n", tmp_str );
+
+	tmp = (uint32)pdb_get_logon_time(sam_pwent);
+	fprintf (ldif, "sambaLogonTime: %lu\n", tmp ? tmp : 0);
+
+	tmp = (uint32)pdb_get_logoff_time(sam_pwent);
+	fprintf (ldif, "sambaLogoffTime: %lu\n", tmp ? tmp : 0);
+
+	tmp = (uint32)pdb_get_kickoff_time(sam_pwent);
+	fprintf (ldif, "sambaKickoffTime: %lu\n", tmp ? tmp : 0);
+
+	tmp = (uint32)pdb_get_pass_last_set_time(sam_pwent);
+	fprintf (ldif, "sambaPwdLastSet: %lu\n", tmp ? tmp : 0);
+
+	tmp = (uint32)pdb_get_pass_can_change_time(sam_pwent);
+	fprintf (ldif, "sambaPwdCanChange: %lu\n", tmp ? tmp : 0);
+
+	tmp = (uint32)pdb_get_pass_must_change_time(sam_pwent);
+	fprintf (ldif, "sambaPwdMustChange: %lu\n\n", tmp ? tmp : 0);
+	return 0;
+}
+
+/*********************************************************
+ dump all Users into ldif file
+ **********************************************************/
+static int print_ldif (struct pdb_context *in, char *ldif_file_name)
+{
+     SAM_ACCOUNT *sam_pwent=NULL; 
+	 BOOL check, ret; 
+	 FILE *ldif_file_ptr = stdout; 
+	 char *suffix = lp_ldap_user_suffix (); 
+
+	if( ldif_file_name != NULL) {
+		ldif_file_ptr = fopen(ldif_file_name, "w");
+
+	 	if (ldif_file_ptr == NULL) { 
+	 		fprintf(stderr,"Failed to create export LDIF file - defaulting to stdout"); 
+		} 
+	} 
+	
+	if(strcmp(suffix, "") == 0) { 
+		fprintf(stderr,"LDAP User Suffix not specified - cannot " 
+			"create LDIF file\n"); 
+		fprintf(stderr,"You must set the \"ldap user suffix\" attribute " 
+			"in smb.conf in order to use \nthe -E option\n"); 
+		return 1; 
+	} 
+	
+	check = NT_STATUS_IS_OK(in->pdb_setsampwent(in, False)); 
+	
+	if (!check) { 
+		return 1; 
+	} 
+	
+	check = True; 
+	
+	if (!(NT_STATUS_IS_OK(pdb_init_sam(&sam_pwent)))) return 1; 
+	
+	fprintf(ldif_file_ptr, "# LDIF file generated by pdbedit tool.\n");
+	while(check && (ret = NT_STATUS_IS_OK(in->pdb_getsampwent(in,sam_pwent)))){ 
+		print_ldif_info (sam_pwent, suffix, ldif_file_ptr); 
+		pdb_free_sam(&sam_pwent); 
+		check = NT_STATUS_IS_OK(pdb_init_sam(&sam_pwent)); 
+	} 
+	
+	if (check) pdb_free_sam(&sam_pwent); 
+		in->pdb_endsampwent(in); 
+		return 0; 
+}
+/*********************************************************
  Start here.
 **********************************************************/
 
@@ -606,6 +732,7 @@
 	static BOOL add_user = False;
 	static BOOL delete_user = False;
 	static BOOL modify_user = False;
+	static BOOL export_to_ldif = False;
 	uint32	setparms, checkparms;
 	int opt;
 	static char *full_name = NULL;
@@ -623,6 +750,7 @@
 	static char *account_policy = NULL;
 	static char *user_sid = NULL;
 	static char *group_sid = NULL;
+	static char *ldif_file_name = NULL;
 	static long int account_policy_value = 0;
 	BOOL account_policy_value_set = False;
 	static BOOL badpw_reset = False;
@@ -638,6 +766,7 @@
 		{"smbpasswd-style",	'w',POPT_ARG_NONE, &spstyle, 0, "give output in smbpasswd style", NULL},
 		{"user",	'u', POPT_ARG_STRING, &user_name, 0, "use username", "USER" },
 		{"fullname",	'f', POPT_ARG_STRING, &full_name, 0, "set full name", NULL},
+		{"ldiffilename",   'F', POPT_ARG_STRING, &ldif_file_name, 0, "full path name of LDIF output file", NULL},
 		{"homedir",	'h', POPT_ARG_STRING, &home_dir, 0, "set home directory", NULL},
 		{"drive",	'D', POPT_ARG_STRING, &home_drive, 0, "set home drive", NULL},
 		{"script",	'S', POPT_ARG_STRING, &logon_script, 0, "set logon script", NULL},
@@ -651,6 +780,7 @@
 		{"backend",	'b', POPT_ARG_STRING, &backend, 0, "use different passdb backend as default backend", NULL},
 		{"import",	'i', POPT_ARG_STRING, &backend_in, 0, "import user accounts from this backend", NULL},
 		{"export",	'e', POPT_ARG_STRING, &backend_out, 0, "export user accounts to this backend", NULL},
+		{"export-ldif",	'E', POPT_ARG_NONE, &export_to_ldif, 0, "export all user accounts to LDIF file", NULL},
 		{"group",	'g', POPT_ARG_NONE, &transfer_groups, 0, "use -i and -e for groups", NULL},
 		{"account-policy",	'P', POPT_ARG_STRING, &account_policy, 0,"value of an account policy (like maximum password age)",NULL},
 		{"value",       'C', POPT_ARG_LONG, &account_policy_value, 'C',"set the account policy to this value", NULL},
@@ -674,10 +804,12 @@
 		}
 	}
 
+#if 0
 	poptGetArg(pc); /* Drop argv[0], the program name */
 
 	if (user_name == NULL)
 		user_name = poptGetArg(pc);
+#endif
 
 	if (!lp_load(dyn_CONFIGFILE,True,False,False)) {
 		fprintf(stderr, "Can't load %s - run testparm to debug it\n", dyn_CONFIGFILE);
@@ -710,8 +842,17 @@
 			(account_policy_value_set ? BIT_ACCPOLVAL : 0) +
 			(backend_in ? BIT_IMPORT : 0) +
 			(backend_out ? BIT_EXPORT : 0) +
-			(badpw_reset ? BIT_BADPWRESET : 0);
+			(badpw_reset ? BIT_BADPWRESET : 0) +
+			(ldif_file_name ? BIT_LDIF_FILE_NAME : 0) +
+			(export_to_ldif ? BIT_EXPORT_LDIF : 0);
 
+	poptGetArg(pc); /* Drop argv[0], the program name */
+
+	if (setparms & BIT_USER) {
+		if (user_name == NULL)
+			user_name = poptGetArg(pc);
+	}
+
 	if (setparms & BIT_BACKEND) {
 		if (!NT_STATUS_IS_OK(make_pdb_context_string(&bdef, backend))) {
 			fprintf(stderr, "Can't initialize passdb backend.\n");
@@ -804,6 +945,16 @@
 			return print_user_info (bdef, user_name, verbose, spstyle);
 		}
 	}
+
+	if (checkparms & BIT_EXPORT_LDIF) {
+		if(checkparms & BIT_LDIF_FILE_NAME) {
+			ldif_file_name = poptGetArg(pc);
+			return print_ldif (bdef, ldif_file_name);
+		}
+		else
+			return print_ldif (bdef, NULL);
+	}
+
 	
 	/* mask out users options */
 	checkparms &= ~MASK_USER_GOOD;


More information about the samba-technical mailing list