📄 roommaker.pl
字号:
#!/usr/bin/perl## roommaker.pl: Predefine persistent rooms for MU-Conference# Requires: Digest::SHA1, XML::Simple#use strict;use Digest::SHA1 qw(sha1_hex);use XML::Simple;# Declare variablesmy $uid;my $gid;my $check;my $name;my $server;my $output;my $roomcfg;my $noticecfg;my $ownerlist;my $adminlist;my $memberlist;my $outcastlist;my $roomsconfig;my $FH;## Get spool directoryprint "Please enter spool directory path (e.g. /usr/local/jabber/spool): ";my $spooldir = <>;chomp $spooldir;if( $spooldir eq ""){ print "No spool directory\n"; exit;}elsif( ! -d $spooldir ){ print "Spool directory does not exist. Exiting \n"; exit;}# Fix spooldir variable, if necessary$spooldir =~ s/\/$//;# Get uid/gid from spool$uid = (stat($spooldir))[4];$gid = (stat($spooldir))[5];umask "0027";## Get room jidprint "Please enter jid for the room: ";my $jid = <>;chomp $jid;if( !($jid =~ /\w@\w/) ){ print "Bad JID - Exiting\n"; exit;}($name, $server) = split(/@/, $jid);my $hash = sha1_hex($jid);## Check if directory existsif( ! -d "$spooldir/$server/" ){ print "$spooldir/$server/ doesn't exist - Create? (Y/N) "; my $input = <>; if( $input =~ /^[Y|y]/ ) { print "Creating Directory\n"; mkdir("$spooldir/$server", 0777); chown $uid, $gid, "$spooldir/$server"; } else { print "Unable to continue. Exiting\n"; exit }}## Print Headerprint "\nConfiguring room $jid\n";print "Filename: $spooldir/$server/$hash.xml\n";## Check if room already definedif( -f "$spooldir/$server/$hash.xml"){ print "Room already defined. Exiting\n"; exit;}$roomcfg->{xdbns} = "muc:room:config";print "\nGeneral Options\n---\n";$roomcfg->{name} = [getText("Room name", $name)];$roomcfg->{secret} = [getText("Password", "")];$roomcfg->{description} = [getText("Room description/MOTD", "")];$roomcfg->{subject} = [getText("Room subject", "")];$roomcfg->{creator} = [getText("Bare JID of room creator", "")];$roomcfg->{public} = [getBoolean("Is room public", 0)];$roomcfg->{maxusers} = [getValue("Maximum Users ", 0)];$roomcfg->{persistant} = [1]; # Has to be persistentprint "\nPermission Options\n---\n";$roomcfg->{visible} = [getBoolean("Allow non-admins to see real jids", 0)];$roomcfg->{subjectlock} = [getBoolean("Can users change subject", 0)];$roomcfg->{private} = [getBoolean("Allow users to IQ query other users", 0)];print "\nLegacy Options:\n---\n";$roomcfg->{legacy} = [getBoolean("Consider all clients legacy", 0)];$noticecfg->{join} = [getText("Legacy join message", "")];$noticecfg->{leave} = [getText("Legacy leave message", "")];$noticecfg->{rename} = [getText("Legacy rename message", "")];$roomcfg->{notice} = [$noticecfg];print "\nModeration Options:\n---\n";$roomcfg->{moderated} = [getBoolean("Is room moderated", 0)];if($roomcfg->{moderated}[0] == 0){ print "Skipping Moderation options\n"; $roomcfg->{defaulttype} = [0]; $roomcfg->{privmsg} = [0];}else{ $roomcfg->{defaulttype} = [getBoolean("Default entry type of participant", 0)]; $roomcfg->{privmsg} = [getBoolean("Default entry type of participant", 0)];}print "\nMember-Only Options:\n---\n";$roomcfg->{invitation} = [getBoolean("Make room member-only", 0)];if($roomcfg->{invitation}[0] == 0){ print "Skipping Moderation options\n"; $roomcfg->{invites} = [0];}else{ $roomcfg->{invites} = [getBoolean("Allow members to send invites", 0)];}print "\nLogging Options:\n---\n";$roomcfg->{logging} = [getBoolean("Enable native room logging", 0)];if($roomcfg->{logging}[0] == 0){ print "Skipping Logging options\n"; $roomcfg->{logformat} = [0];}else{ $roomcfg->{logformat} = [getOption("Log Format\n0] Plain Text\n1] XML\n2] XHTML\n", 0)];}print "\nOwner List:\n---\n";$ownerlist->{xdbns} = "muc:list:owner";$ownerlist->{item} = [getList("JID of owner")];print "\nAdmin List:\n---\n";$adminlist->{xdbns} = "muc:list:admin";$adminlist->{item} = [getList("JID of admin")];print "\nMember List:\n---\n";$memberlist->{xdbns} = "muc:list:member";$memberlist->{item} = [getList("JID of member")];print "\nOutcast List:\n---\n";$outcastlist->{xdbns} = "muc:list:outcast";$outcastlist->{item} = [getList("JID of outcast")];$output->{room} = $roomcfg;$output->{list} = [$ownerlist, $adminlist, $memberlist, $outcastlist];print "\nWriting Room definition file\n";open(DATA, ">$spooldir/$server/$hash.xml");print DATA XMLout($output, rootname => "xdb");close(DATA);if( ! -f "$spooldir/$server/rooms.xml"){ print "Room registry not found. Creating\n"; my $list; my $roomitem; $roomitem->{name} = $jid; $roomitem->{jid} = "$hash\@$server"; $list->{item} = [$roomitem]; $list->{xdbns} = "muc:room:list"; $roomsconfig->{registered} = [$list];}else{ my $list; my $roomitem; $roomsconfig = XMLin("$spooldir/$server/rooms.xml"); $roomitem->{name} = $jid; $roomitem->{jid} = "$hash\@$server"; $roomsconfig->{registered}->{item} = [$roomsconfig->{registered}->{item}, $roomitem];} print "\nWriting updated Room registry file\n";open(DATA, ">$spooldir/$server/rooms.xml");print DATA XMLout($roomsconfig, rootname => "xdb");close(DATA);exit;##Functionssub getText{ my $text = shift; my $default = shift; print "$text (text) [Default: $default]: "; my $value = <>; chomp $value; if($value eq "") { return $default; } else { return $value; }}sub getBoolean{ my $text = shift; my $default = shift; print "$text (0/1) [Default: $default]: "; my $value = <>; chomp $value; if($value eq "" or !( $value =~ /^[1|0]$/)) { return $default; } else { return $value; }}sub getValue{ my $text = shift; my $default = shift; print "$text (value) [Default: $default]: "; my $value = <>; chomp $value; if($value eq "" or !( $value =~ /^(\d*)$/)) { return $default; } else { return $value; }}sub getOption{ my $text = shift; my $default = shift; print "$text [Default: $default]: "; my $value = <>; chomp $value; if($value eq "" or !( $value =~ /^(\d*)$/)) { return $default; } else { return $value; }}sub getList{ my $text = shift; my $data = 1; my @list; while($data) { print "$text (Empty line to exit): "; my $value = <>; chomp $value; if($value eq "") { $data = 0; } else { my %users; $users{jid} = $value; push @list, \%users; } } return @list;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -