Skip to content

Instantly share code, notes, and snippets.

@crutch12
Last active June 10, 2024 14:12
Show Gist options
  • Save crutch12/b2cf37f4366ea5035da024adb1b34fe3 to your computer and use it in GitHub Desktop.
Save crutch12/b2cf37f4366ea5035da024adb1b34fe3 to your computer and use it in GitHub Desktop.
// Быстрое создание учёток через freeipa
// Скрипт исполняется в браузере, после авторизации в freeipa
// const users = [
// {
// first_name: 'Данёк',
// last_name: 'Якубович',
// email: '[email protected]', // указываем email человека (можно пропустить, тогда будет без email)
// // пароль - генерируем отсюда https://www.random.org/passwords/?num=5&len=12&format=html&rnd=new
// password: 'MR132kKk9123123az5gnm',
// // (!) указываем нужные группы (например 'internal-interns' или 'internal-developers')
// groups: [
// 'internal-interns',
// ],
// },
// ];
const api_version = window.ipa_loader ? window.ipa_loader.api_version : '2.237';
const rusToLat = function (str) {
let ru = {
а: 'a',
б: 'b',
в: 'v',
г: 'g',
д: 'd',
е: 'e',
ё: 'e',
ж: 'zh',
з: 'z',
и: 'i',
к: 'k',
л: 'l',
м: 'm',
н: 'n',
о: 'o',
п: 'p',
р: 'r',
с: 's',
т: 't',
у: 'u',
ф: 'f',
х: 'h',
ц: 'c',
ч: 'ch',
ш: 'sh',
щ: 'sch',
ы: 'i',
э: 'e',
ю: 'yu',
я: 'ja',
ъ: '',
ь: '',
й: 'j',
};
return [...str]
.map((l) => {
let latL = ru[l.toLocaleLowerCase()];
if (l !== l.toLocaleLowerCase()) {
latL = latL.charAt(0).toLocaleUpperCase() + latL.slice(1);
} else if (latL === undefined) {
latL = l;
}
return latL;
})
.join('');
};
const callApi = (data) => {
return fetch('/ipa/session/json', {
headers: {
accept: 'application/json',
'accept-language': 'en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7',
'cache-control': 'no-cache',
'content-type': 'application/json',
pragma: 'no-cache',
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'x-requested-with': 'XMLHttpRequest',
'x-sarah-locale': 'ru',
},
referrerPolicy: 'strict-origin-when-cross-origin',
body: JSON.stringify(data),
method: 'POST',
mode: 'cors',
credentials: 'include',
}).then((r) => r.json());
};
const createUser = async (user) => {
const login = `${rusToLat(user.first_name[0])}${rusToLat(user.last_name)}`.toLocaleLowerCase();
const userData = {
method: 'user_add',
params: [
[login],
{
givenname: user.first_name,
sn: user.last_name,
userpassword: user.password,
version: api_version,
},
],
};
console.log(
'Начинаем создавать пользователя',
login,
user.first_name,
user.last_name,
user.password,
user.groups && user.groups.join(' '),
);
await callApi(userData);
if (user.email) {
const emailData = {
method: 'user_mod',
params: [
[login],
{
all: true,
rights: true,
mail: user.email,
version: api_version,
},
],
};
console.log('Выставляем email', login, user.email);
await callApi(emailData);
}
if (user.groups && user.groups.length > 0) {
const groupsData = {
method: 'batch',
params: [
user.groups.map(group => [
{
method: 'group_add_member',
params: [
[group],
{
user: login,
},
],
},
]),
{
version: api_version,
},
],
};
console.log('Выставляем группы', login, user.groups.join(' '));
await callApi(groupsData);
}
};
const createUsers = async (users) => {
for (const user of users) {
const index = users.indexOf(user);
console.log('----------------------------');
console.log(`Создаём пользователя ${index + 1}/${users.length}`);
try {
await createUser(user);
} catch (err) {
console.error(`Не удалось создать ${user.first_name} ${user.last_name}`);
console.error(err);
}
}
console.log('----------------------------');
console.log('----------------------------');
console.log('----------------------------');
console.log('Все пользователи обработаны, проверьте, что все создались успешно!');
console.log('----------------------------');
console.log('----------------------------');
console.log('----------------------------');
};
export { createUsers }
// Запускаем в браузере
const { createUsers } = await import('https://cdn.gisthostfor.me/crutch12-JF40hoNtwg-1-ipa-create-users.js')
// Сюда пишем пользователей (!) и группы (!)
// Больше ничего менять не надо
const users = [
{
first_name: 'Данёк',
last_name: 'Якубович',
email: '[email protected]', // указываем email человека (можно пропустить, тогда будет без email)
// пароль - генерируем отсюда https://www.random.org/passwords/?num=5&len=12&format=html&rnd=new
password: 'MR132kKk9123123az5gnm',
// (!) указываем нужные группы (например 'internal-interns' или 'internal-developers')
groups: [
'internal-interns',
],
},
];
await createUsers(users)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment