add script to create emails by hand from the commandline
This commit is contained in:
parent
c76903673b
commit
fbb834c75e
|
@ -654,6 +654,7 @@ src/generate_apache_conf.php -text
|
|||
src/generate_bind_conf.php -text
|
||||
src/inotify_do_actions.sh -text
|
||||
src/inotify_update_domains.sh -text
|
||||
src/mail_add.php -text
|
||||
src/mail_dodelete.php -text
|
||||
src/mem_add -text
|
||||
src/mem_del -text
|
||||
|
|
|
@ -0,0 +1,147 @@
|
|||
#!/usr/bin/php -q
|
||||
<?php
|
||||
/**
|
||||
* @file helper function to create emails from the commandline
|
||||
*
|
||||
* automatically generates a password based on the configured
|
||||
* password generators
|
||||
*
|
||||
* Limitations
|
||||
* - has snarky comments about how PHP or AlternC is badly designed
|
||||
* - can create a mailbox or a forward, not both
|
||||
* - configuration is inline here
|
||||
* - quotas and "dryrun" options are hardcoded because php's getopt sucks
|
||||
*/
|
||||
|
||||
// just for inspection
|
||||
global $cuid;
|
||||
|
||||
// those will be tried in order, the first one to return more than 7
|
||||
// chars will win
|
||||
$generators = array('pwqgen', 'pwgen');
|
||||
$dryrun = false;
|
||||
// 1GB default quota
|
||||
$default_quotas = 1024; // in MB because using bytes would be too
|
||||
// precise (try to guess AlternC, just you try)
|
||||
|
||||
require_once("/usr/share/alternc/panel/class/config_nochk.php");
|
||||
|
||||
function usage() {
|
||||
global $argv;
|
||||
// putting {$argv[0]} or $argv[0] in the heredoc fails
|
||||
$wtfphp = $argv[0];
|
||||
$u = <<<EOF
|
||||
Usage: $wtfphp <email> <alias> ...
|
||||
|
||||
email: full email adress, including domain, which must exist
|
||||
alias: one or many aliases the email should forward to, space separated
|
||||
|
||||
EOF;
|
||||
error_log($u);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (count($argv) < 2) {
|
||||
usage();
|
||||
}
|
||||
|
||||
$user = preg_split('/@/', $argv[1])[0]; // first argument is user@domain
|
||||
$domain = preg_split('/@/', $argv[1])[1];
|
||||
$recipients = array_slice($argv, 2); // rest is recipients
|
||||
|
||||
// there's no function to do that, oddly enough...
|
||||
// there's one to extract the compte from the mail_id (!) but we
|
||||
// haven't created it yet...
|
||||
$db->query('SELECT id,compte FROM domaines WHERE domaine="'.addslashes($domain).'"');
|
||||
if ($db->next_record()) {
|
||||
$compte = $db->f('compte');
|
||||
$domain_id = $db->f('id');
|
||||
}
|
||||
else {
|
||||
error_log("domain $domain not found");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
foreach ($generators as $generator) {
|
||||
$password = `$generator 2>/dev/null`;
|
||||
if (!is_null($password) and strlen($password) > 7) {
|
||||
$password = trim($password);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (is_null($password)) {
|
||||
error_log('password generators failed to produce 8 characters: ' . join("\n", $generators));
|
||||
exit(3);
|
||||
}
|
||||
|
||||
/* need not to be $quota because that would replace alternc's global
|
||||
* $quota... even though we don't say global $quota anywhere here, yay
|
||||
* php scoping.
|
||||
*/
|
||||
$quotas = $default_quotas;
|
||||
$r = join(", ", $recipients);
|
||||
|
||||
print <<<EOF
|
||||
user: $user
|
||||
domain: $domain
|
||||
compte: $compte
|
||||
password: $password
|
||||
quota: $default_quotas
|
||||
recipients: $r
|
||||
|
||||
EOF;
|
||||
|
||||
if ($dryrun) {
|
||||
error_log('not creating email because of $dryrun is true');
|
||||
exit(0);
|
||||
}
|
||||
print "cuid: $cuid\n";
|
||||
$mem->su($compte);
|
||||
print "cuid: $cuid\n";
|
||||
|
||||
/* function signature is:
|
||||
* function create($dom_id, $mail,$type="",$dontcheck=false)
|
||||
* yet $type is never passed anywhere and is actually empty in the
|
||||
* database (!) $dontcheck is undocumented, so we'll ignore it
|
||||
*
|
||||
* also, this function explicitely tells me to not use it, but doesn't
|
||||
* provide an alternative. i choose to disobey instead of rewriting it
|
||||
* from scratch
|
||||
*/
|
||||
if (!($mail_id = $mail->create($domain_id, $user))) {
|
||||
error_log('failed to create: ' . $err->errstr());
|
||||
exit(4);
|
||||
}
|
||||
|
||||
/* function set_passwd($mail_id,$pass)
|
||||
*
|
||||
* just set the password
|
||||
*
|
||||
* no idea why this is a different function.
|
||||
*/
|
||||
if (!$mail->set_passwd($mail_id,$password)) {
|
||||
error_log("failed to set password on mail $mail_id: " . $err->errstr());
|
||||
exit(5);
|
||||
}
|
||||
|
||||
/* function set_details($mail_id, $islocal, $quotamb,
|
||||
* $recipients,$delivery="dovecot",$dontcheck=false)
|
||||
*
|
||||
* you read that right, recipients is a string (!)
|
||||
*
|
||||
* if we have no aliases, it's a mailbox. deal with it.
|
||||
*/
|
||||
if (!$mail->set_details($mail_id, !count($recipients), $quota, join("\n", $recipients))) {
|
||||
error_log('failed to set details: ' . $err->errstr());
|
||||
exit(6);
|
||||
}
|
||||
|
||||
// maybe we need to call the hooks? i don't know!
|
||||
/* $rh=$hooks->invoke("mail_edit_post",array($mail_id)); */
|
||||
/* if (in_array(false,$res,true)) { */
|
||||
/* include ("mail_edit.php"); */
|
||||
/* exit(); */
|
||||
/* } else { */
|
||||
/* foreach($rh as $h) if ($h) $error.=$h."<br />"; */
|
||||
/* } */
|
||||
|
Loading…
Reference in New Issue