Advertisement
crutch12

freeipa create accounts

May 30th, 2024 (edited)
1,185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Быстрое создание учёток через freeipa
  2. // Скрипт исполняется в браузере, после авторизации в freeipa
  3.  
  4. // Сюда пишем пользователей (!) и группы (!)
  5. // Больше ничего менять не надо
  6. const users = [
  7.   {
  8.     first_name: 'Данёк',
  9.     last_name: 'Якубович',
  10.     email: 'dtestov@example.com', // указываем email человека (можно пропустить, тогда будет без email)
  11.     // пароль - генерируем отсюда https://www.random.org/passwords/?num=5&len=12&format=html&rnd=new
  12.     password: 'MR132kKk9123123az5gnm',
  13.     // (!) указываем нужные группы (например 'internal-interns' или 'internal-developers')
  14.     groups: [
  15.       'internal-interns',
  16.     ],
  17.   },
  18. ];
  19.  
  20. // ===================================================== //
  21.  
  22. const api_version = window.ipa_loader ? window.ipa_loader.api_version : '2.237';
  23.  
  24. const rusToLat = function (str) {
  25.   let ru = {
  26.     а: 'a',
  27.     б: 'b',
  28.     в: 'v',
  29.     г: 'g',
  30.     д: 'd',
  31.     е: 'e',
  32.     ё: 'e',
  33.     ж: 'zh',
  34.     з: 'z',
  35.     и: 'i',
  36.     к: 'k',
  37.     л: 'l',
  38.     м: 'm',
  39.     н: 'n',
  40.     о: 'o',
  41.     п: 'p',
  42.     р: 'r',
  43.     с: 's',
  44.     т: 't',
  45.     у: 'u',
  46.     ф: 'f',
  47.     х: 'h',
  48.     ц: 'c',
  49.     ч: 'ch',
  50.     ш: 'sh',
  51.     щ: 'sch',
  52.     ы: 'i',
  53.     э: 'e',
  54.     ю: 'yu',
  55.     я: 'ja',
  56.     ъ: '',
  57.     ь: '',
  58.     й: 'j',
  59.   };
  60.  
  61.   return [...str]
  62.     .map((l) => {
  63.       let latL = ru[l.toLocaleLowerCase()];
  64.  
  65.       if (l !== l.toLocaleLowerCase()) {
  66.         latL = latL.charAt(0).toLocaleUpperCase() + latL.slice(1);
  67.       } else if (latL === undefined) {
  68.         latL = l;
  69.       }
  70.  
  71.       return latL;
  72.     })
  73.     .join('');
  74. };
  75.  
  76. const callApi = (data) => {
  77.   return fetch('/ipa/session/json', {
  78.     headers: {
  79.       accept: 'application/json',
  80.       'accept-language': 'en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7',
  81.       'cache-control': 'no-cache',
  82.       'content-type': 'application/json',
  83.       pragma: 'no-cache',
  84.       'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
  85.       'sec-ch-ua-mobile': '?0',
  86.       'sec-ch-ua-platform': '"Windows"',
  87.       'sec-fetch-dest': 'empty',
  88.       'sec-fetch-mode': 'cors',
  89.       'sec-fetch-site': 'same-origin',
  90.       'x-requested-with': 'XMLHttpRequest',
  91.       'x-sarah-locale': 'ru',
  92.     },
  93.     referrerPolicy: 'strict-origin-when-cross-origin',
  94.     body: JSON.stringify(data),
  95.     method: 'POST',
  96.     mode: 'cors',
  97.     credentials: 'include',
  98.   }).then((r) => r.json());
  99. };
  100.  
  101. const createUser = async (user) => {
  102.   const login = `${rusToLat(user.first_name.trim()[0])}${rusToLat(user.last_name.trim())}`.toLocaleLowerCase();
  103.  
  104.   const userData = {
  105.     method: 'user_add',
  106.     params: [
  107.       [login.trim()],
  108.       {
  109.         givenname: user.first_name.trim(),
  110.         sn: user.last_name.trim(),
  111.         userpassword: user.password.trim(),
  112.         version: api_version,
  113.       },
  114.     ],
  115.   };
  116.  
  117.   console.log(
  118.     'Начинаем создавать пользователя',
  119.     login,
  120.     user.first_name,
  121.     user.last_name,
  122.     user.password,
  123.     user.groups && user.groups.join(' '),
  124.   );
  125.  
  126.   await callApi(userData);
  127.  
  128.   if (user.email) {
  129.     const emailData = {
  130.       method: 'user_mod',
  131.       params: [
  132.         [login.trim()],
  133.         {
  134.           all: true,
  135.           rights: true,
  136.           mail: user.email.trim(),
  137.           version: api_version,
  138.         },
  139.       ],
  140.     };
  141.  
  142.     console.log('Выставляем email', login, user.email);
  143.  
  144.     await callApi(emailData);
  145.   }
  146.  
  147.   if (user.groups && user.groups.length > 0) {
  148.     const groupsData = {
  149.       method: 'batch',
  150.       params: [
  151.         user.groups.map(group => [
  152.           {
  153.             method: 'group_add_member',
  154.             params: [
  155.               [group.trim()],
  156.               {
  157.                 user: login.trim(),
  158.               },
  159.             ],
  160.           },
  161.         ]),
  162.         {
  163.           version: api_version,
  164.         },
  165.       ],
  166.     };
  167.  
  168.     console.log('Выставляем группы', login, user.groups.join(' '));
  169.  
  170.     await callApi(groupsData);
  171.   }
  172. };
  173.  
  174. const createUsers = async (users) => {
  175.   for (const user of users) {
  176.     const index = users.indexOf(user);
  177.     console.log('----------------------------');
  178.     console.log(`Создаём пользователя ${index + 1}/${users.length}`);
  179.     try {
  180.       await createUser(user);
  181.     } catch (err) {
  182.       console.error(`Не удалось создать ${user.first_name} ${user.last_name}`);
  183.       console.error(err);
  184.     }
  185.   }
  186.  
  187.   console.log('----------------------------');
  188.   console.log('----------------------------');
  189.   console.log('----------------------------');
  190.   console.log('Все пользователи обработаны, проверьте, что все создались успешно!');
  191.   console.log('----------------------------');
  192.   console.log('----------------------------');
  193.   console.log('----------------------------');
  194. };
  195.  
  196. await createUsers(users);
  197.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement