#include "filesrvmng.h" void usage() { printf ("Usage: filesrvmng [OPTIONS]...\n\n"); printf ( " --reconfigure-all\n" " create configuration files for all shares\n" " --add-smbuser --smbuser-name= --user-name=\n" " add samba user with no password.\n" " --set-smbuser-password --smbuser-name= --user-name=\n" " set password for samba user.\n" " The noncrypted smbuser password is transferred in the environment variable PSA_PASSWORD\n" " --rename-smbuser --old-smbuser-name= --new-smbuser-name= --user-name=\n" " rename samba user.\n" " --del-smbuser --smbuser-name= --user-name=\n" " delete samba user.\n" " --add-share --share-name= --path= [--writable] [--guest-ok] [--description=] (--valid-smbusers=|--valid-smbusers-any|--valid-smbusers-none)\n" " add samba share\n" " --update-share --share-name= --path= [--writable] [--guest-ok] [--description=] (--valid-smbusers=|--valid-smbusers-any|--valid-smbusers-none)\n" " update samba share\n" " --rename-share --old-share-name= --new-share-name=\n" " rename samba share\n" " --del-share --share-name=\n" " delete samba share\n" " --set-preferences --workgroup= [--description=] [--encrypt-passwords] [--guest-account=] [--password-server=] --security=user|share|domain|server|ads\n" " set global preferences\n" " --usage-status\n" " get usage status\n" " -w, --without-restart\n" " without restart fileserver. Can used with another options\n" " -p, --start\n" " start fileserver\n" " -o, --stop\n" " stop fileserver\n" " -s, --status\n" " fileserver status\n" " -r, --restart\n" " restart fileserver\n" " -h, --help\n" " display this help and exit\n" ); exit(0); } // types of actions enum action_type_t { NO_ACTION, // actions RECONFIGURE_ALL, ADD_SMBUSER, SET_SMBUSER_PASSWORD, RENAME_SMBUSER, DEL_SMBUSER, ADD_SHARE, UPDATE_SHARE, RENAME_SHARE, DEL_SHARE, SET_PREFERENCES, USAGE_STATUS, // alphabet actions HELP }; int main (int argc, char **argv, char **envp) { // getopt vars int c; int option_index; static struct option long_options[] = { // parameters {"smbuser-name", 1, 0, 0}, {"user-name", 1, 0, 0}, {"old-smbuser-name", 1, 0, 0}, {"new-smbuser-name", 1, 0, 0}, {"share-name", 1, 0, 0}, {"path", 1, 0, 0}, {"description", 1, 0, 0}, {"valid-smbusers", 1, 0, 0}, {"old-share-name", 1, 0, 0}, {"new-share-name", 1, 0, 0}, {"workgroup", 1, 0, 0}, {"writable", 0, 0, 0}, {"guest-ok", 0, 0, 0}, {"valid-smbusers-any", 0, 0, 0}, {"valid-smbusers-none", 0, 0, 0}, {"encrypt-passwords", 0, 0, 0}, {"guest-account", 1, 0, 0}, {"password-server", 1, 0, 0}, {"security", 1, 0, 0}, // actions {"reconfigure-all", 0, 0, 0}, {"add-smbuser", 0, 0, 0}, {"set-smbuser-password", 0, 0, 0}, {"rename-smbuser", 0, 0, 0}, {"del-smbuser", 0, 0, 0}, {"add-share", 0, 0, 0}, {"update-share", 0, 0, 0}, {"rename-share", 0, 0, 0}, {"del-share", 0, 0, 0}, {"set-preferences", 0, 0, 0}, {"usage-status", 0, 0, 0}, // alphabet actions {"help", 0, 0, 'h'}, // independed actions {"start", 0, 0, 'p'}, {"stop", 0, 0, 'o'}, {"status", 0, 0, 's'}, {"restart", 0, 0, 'r'}, {"without-restart", 0, 0, 'w'}, // end {0, 0, 0, 0} }; enum action_type_t action = NO_ACTION; int pflag, oflag, sflag, rflag, wflag; // parameters vars static char SmbuserName[N], UserName[N], OldSmbuserName[N], NewSmbuserName[N], ShareName[N], Path[N], Description[N], ValidSmbusers[N], OldShareName[N], NewShareName[N], Workgroup[N], GuestAccount[N], PasswordServer[N], Security[N]; int Writable, GuestOk, ValidSmbusersAny, ValidSmbusersNone, EncryptPasswords; int checkSmbuserName, checkUserName, checkOldSmbuserName, checkNewSmbuserName, checkShareName, checkPath, checkDescription, checkValidSmbusers, checkOldShareName, checkNewShareName, checkWorkgroup, checkGuestAccount, checkPasswordServer, checkSecurity; // other vars char buff[N]; int ret = OK; // BEGIN pflag = oflag = sflag = rflag = wflag = 0; checkSmbuserName = checkUserName = checkOldSmbuserName = checkNewSmbuserName = checkShareName = checkPath = checkDescription = checkValidSmbusers = checkOldShareName = checkNewShareName = checkWorkgroup = checkGuestAccount = checkPasswordServer = checkSecurity = 0; Writable = GuestOk = ValidSmbusersAny = ValidSmbusersNone = EncryptPasswords = 0; PROGNAME = argv[0]; // parse command line arguments while (1) { option_index = 0; c = getopt_long (argc, argv, "hposrw", long_options, &option_index); if (c == -1) break; switch (c) { case 0: switch (option_index) { // with options case 0: if (optarg) { strncpy(SmbuserName, optarg, sizeof(SmbuserName)); } break; case 1: if (optarg) { strncpy(UserName, optarg, sizeof(UserName)); } break; case 2: if (optarg) { strncpy(OldSmbuserName, optarg, sizeof(OldSmbuserName)); } break; case 3: if (optarg) { strncpy(NewSmbuserName, optarg, sizeof(NewSmbuserName)); } break; case 4: if (optarg) { strncpy(ShareName, optarg, sizeof(ShareName)); } break; case 5: if (optarg) { strncpy(Path, optarg, sizeof(Path)); } break; case 6: if (optarg) { strncpy(Description, optarg, sizeof(Description)); } break; case 7: if (optarg) { strncpy(ValidSmbusers, optarg, sizeof(ValidSmbusers)); } break; case 8: if (optarg) { strncpy(OldShareName, optarg, sizeof(OldShareName)); } break; case 9: if (optarg) { strncpy(NewShareName, optarg, sizeof(NewShareName)); } break; case 10: if (optarg) { strncpy(Workgroup, optarg, sizeof(Workgroup)); } break; case 11: Writable = 1; break; case 12: GuestOk = 1; break; case 13: ValidSmbusersAny = 1; break; case 14: ValidSmbusersNone = 1; break; case 15: EncryptPasswords = 1; break; case 16: if (optarg) { strncpy(GuestAccount, optarg, sizeof(GuestAccount)); } break; case 17: if (optarg) { strncpy(PasswordServer, optarg, sizeof(PasswordServer)); } break; case 18: if (optarg) { strncpy(Security, optarg, sizeof(Security)); } break; // actions case 19: if (action == NO_ACTION) { action = RECONFIGURE_ALL; } break; case 20: if (action == NO_ACTION) { action = ADD_SMBUSER; checkSmbuserName = checkUserName = 1; } break; case 21: if (action == NO_ACTION) { action = SET_SMBUSER_PASSWORD; checkSmbuserName = checkUserName = 1; } break; case 22: if (action == NO_ACTION) { action = RENAME_SMBUSER; checkOldSmbuserName = checkNewSmbuserName = checkUserName = 1; } break; case 23: if (action == NO_ACTION) { action = DEL_SMBUSER; checkSmbuserName = checkUserName = 1; } break; case 24: if (action == NO_ACTION) { action = ADD_SHARE; checkShareName = checkPath = 1; } break; case 25: if (action == NO_ACTION) { action = UPDATE_SHARE; checkShareName = checkPath = 1; } break; case 26: if (action == NO_ACTION) { action = RENAME_SHARE; checkOldShareName = checkNewShareName = 1; } break; case 27: if (action == NO_ACTION) { action = DEL_SHARE; checkShareName = 1; } break; case 28: if (action == NO_ACTION) { action = SET_PREFERENCES; checkWorkgroup = checkSecurity = 1; } break; case 29: if (action == NO_ACTION) { action = USAGE_STATUS; } break; default: // unreachable break; } // printf ("option %s, index %d", long_options[option_index].name, option_index); // if (optarg) // printf (" with arg %s", optarg); // printf ("\n"); break; // alphabet actions case 'h': // help action = HELP; break; // independed actions case 'p': pflag = 1; break; case 'o': oflag = 1; break; case 's': sflag = 1; break; case 'r': rflag = 1; break; case 'w': wflag = 1; break; case '?': // unknown option snprintf(buff, sizeof(buff), "Unknown option in command string, see log for details"); messlog(buff, EXIT, MESS); break; default: // unreachable break; } } // check unprocessed parameters check_unprocessed_parameters(argc, optind, argv); // check parameters check_parameter(checkSmbuserName, SmbuserName, "smbuser-name"); check_parameter(checkUserName, UserName, "user-name"); check_parameter(checkOldSmbuserName, OldSmbuserName, "old-smbuser-name"); check_parameter(checkNewSmbuserName, NewSmbuserName, "new-smbuser-name"); check_parameter(checkShareName, ShareName, "share-name"); check_parameter(checkPath, Path, "path"); check_parameter(checkDescription, Description, "description"); check_parameter(checkValidSmbusers, ValidSmbusers, "valid-smbusers"); check_parameter(checkOldShareName, OldShareName, "old-share-name"); check_parameter(checkNewShareName, NewShareName, "new-share-name"); check_parameter(checkWorkgroup, Workgroup, "workgroup"); check_parameter(checkGuestAccount, GuestAccount, "guest-account"); check_parameter(checkPasswordServer, PasswordServer, "password-server"); check_parameter(checkSecurity, Security, "security"); // process commands autoprepend(); // simple actions with exit after it if (pflag || rflag) { // start & restart ret = restart_daemon(SMB_SERVICE, "restart"); #ifdef PLESK_Linux if (ret == OK) { path_exec(CHKCONFIG_CMD, SMB_SERVICE, "on", NULL); } #endif psaexit(ret); } if (oflag) { // stop ret = restart_daemon(SMB_SERVICE, "stop"); #ifdef PLESK_Linux path_exec(CHKCONFIG_CMD, SMB_SERVICE, "off", NULL); #endif psaexit(ret); } if (sflag) { // status print_status(restart_daemon(SMB_SERVICE, "status")); psaexit(0); } switch (action) { case ADD_SMBUSER: ret = add_smbuser(SmbuserName, UserName); break; case SET_SMBUSER_PASSWORD: ret = set_smbuser_password(SmbuserName, UserName); break; case RENAME_SMBUSER: ret = rename_smbuser(OldSmbuserName, NewSmbuserName, UserName); ret |= create_config(); //needed for reconfigure "valid users" if (!wflag) { restart_daemon(SMB_SERVICE, "restart"); } break; case DEL_SMBUSER: ret = del_smbuser(SmbuserName, UserName); ret |= create_config(); //needed for reconfigure "valid users" if (!wflag) { restart_daemon(SMB_SERVICE, "restart"); } break; case RECONFIGURE_ALL: case ADD_SHARE: case UPDATE_SHARE: case RENAME_SHARE: case DEL_SHARE: case SET_PREFERENCES: ret |= create_config(); if (!wflag) { restart_daemon(SMB_SERVICE, "restart"); } break; case USAGE_STATUS: ret = usage_status(); break; case HELP: case NO_ACTION: default: usage(); } psaexit(ret); return ret; }