Index: /freepbx/branches/ari_changes/buildtools/README.directory =================================================================== --- /freepbx/branches/ari_changes/buildtools/README.directory (revision 4993) +++ /freepbx/branches/ari_changes/buildtools/README.directory (revision 4993) @@ -0,0 +1,42 @@ +Build Tools: + +This directory contains tools that are used to build and package FreePBX. +This document will describe the tools available, what they do and how you +use them. + +WARNING: Some of these tools will do direct svn checkin's and should be used + with caution. Please review the scripts before doing a publish + and make sure they do no need to be updated. At this time they do + very little error checking and should evolve to improve over time. + +/-------------------------------------------------------------------------------------------- +pack_javascripts.sh, jsmin.rb: + +These two scripts are used to package the libfreebx.javascripts.js by taking +all the javascript libraries that are used under the common directory and +running them through jsmin.rb, a simple Ruby script that does a reasonable +job of compressing the scripts. + + +/-------------------------------------------------------------------------------------------- +generate-release.sh + +This script automates most of the process of generating the release tarballs and +associated tags to do a release. It is oulined on the wiki and the key stages +are listed here (from the wiki): + + * Now run the "generate-release.sh " script which will: + * package and checking libfreepbx.javascripts.js if needed + * generate the md5 hash for the new version and commit it + * create a tag from the current branch + * svn cp the core and framework modules into ~amp_conf/htdocs/admin/modules of the tag + * creates and cd to /usr/src/freepbx-release directory + * svn exports the tag to create a normal freepbx-''''.tar.gz + * uses the modlist.sh list to export all the modules and creates a freepbx-''''-withmodules.tar.gz + +/-------------------------------------------------------------------------------------------- +md5-amp_conf.sh + +This script is not really used any longer as the functionality is incorporated into +generate-release.sh. It's purpose is to generate the md5 sum files. It does not checkin +files to svn. Index: /freepbx/branches/ari_changes/buildtools/pack_javascripts.sh =================================================================== --- /freepbx/branches/ari_changes/buildtools/pack_javascripts.sh (revision 4993) +++ /freepbx/branches/ari_changes/buildtools/pack_javascripts.sh (revision 4993) @@ -0,0 +1,5 @@ +#!/bin/sh + +DIR="../amp_conf/htdocs/admin/common" + +cat $DIR/script.legacy.js $DIR/jquery-1.1.3.1.js $DIR/jquery.tabs-2.7.4.js $DIR/jquery.dimensions.js $DIR/interface.dim.js | ./jsmin.rb > $DIR/libfreepbx.javascripts.js Index: /freepbx/branches/ari_changes/buildtools/generate-release.sh =================================================================== --- /freepbx/branches/ari_changes/buildtools/generate-release.sh (revision 5946) +++ /freepbx/branches/ari_changes/buildtools/generate-release.sh (revision 5946) @@ -0,0 +1,97 @@ +#!/bin/bash +# use this script like: +# md5-amp_conf.sh 1.10.00X + +# WARNING: THIS IS HARDCODED TO THE 2.3 BRANCH +# +# TODO: SHOULD CHECK THE VERSION OF THE MODULES BEFORE PROCEEDING +# +module_url="http://svn.freepbx.org/modules/branches/2.5" +core_url=${module_url}/core +framework_url=${module_url}/framework +dashboard_url=${module_url}/dashboard +customappsreg_url=${module_url}/customappsreg +voicemail_url=${module_url}/voicemail +recordings_url=${module_url}/recordings +music_url=${module_url}/music +featurecodeadmin_url=${module_url}/featurecodeadmin +infoservices_url=${module_url}/infoservices + +case "$1" in + ?*) + +ver=$1 + +cd .. + +# Make sure everything is up-to-date +svn update + +# Now make sure javascript library reflects all the changes +cd buildtools +./pack_javascripts.sh +cd .. +svn ci --message "Auto checkin packed libfreepbx.javascripts.js as part of build process" amp_conf/htdocs/admin/common/libfreepbx.javascripts.js + +# This adds the MD5 Sum for all the relevant files that gets checked in on the next steps below +# +cd amp_conf +find agi-bin astetc bin htdocs htdocs_panel mohmp3 sbin sounds -type f | xargs md5sum | grep -v .svn > ../upgrades/$ver.md5 + + ;; + *) + +echo "usage: generate-release.sh "; +exit + + ;; +esac + + +# Prepare and checkin the MD5 Sum +# +cd ../upgrades +svn add $ver.md5 +svn ps svn:mime-type text/plain $ver.md5 +svn ps svn:eol-style native $ver.md5 +svn ci -m "Creating release $ver" + +# Back up to the top, do an svn info to get the URL so we can use it to create a tag +# +cd .. +cur=`svn info | grep URL | awk ' { print $2 }'` +svn cp -m "Automatic tag of $ver" $cur http://svn.freepbx.org/freepbx/tags/$ver + +# Now that the tag is made, we want to add core and framework to the tag so that +# the tag reflects the tarball. Then we will use the tag to generate the releases +# +svn cp -m "Automatic packaging of core with $ver" $core_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of framework with $ver" $framework_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of dashboard with $ver" $dashboard_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of customappsreg with $ver" $customappsreg_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of voicemail with $ver" $voicemail_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of recordings with $ver" $recordings_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of music with $ver" $music_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of featurecodeadmin with $ver" $featurecodeadmin_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of infoservices with $ver" $infoservices_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ + +# Now clear out the release diretory where we will build the tarballs and grab it from the tag to get core and framework +# +mkdir -p /usr/src/freepbx-release +rm -rf /usr/src/freepbx-release/freepbx-$ver + +# Use the tag to build the tarball +# +svn export http://svn.freepbx.org/freepbx/tags/$ver /usr/src/freepbx-release/freepbx-$ver + +cd /usr/src/freepbx-release +tar zcvf freepbx-$ver.tar.gz freepbx-$ver +cd freepbx-$ver/amp_conf/htdocs/admin/modules/ +. ./import.sh + +# import should not bring in core and framework, those were removed from its list +# +find . -name .svn -exec rm -rf {} \; +cd /usr/src/freepbx-release +tar zcvf freepbx-$ver-withmodules.tar.gz freepbx-$ver + Index: /freepbx/branches/ari_changes/buildtools/jsmin.rb =================================================================== --- /freepbx/branches/ari_changes/buildtools/jsmin.rb (revision 4993) +++ /freepbx/branches/ari_changes/buildtools/jsmin.rb (revision 4993) @@ -0,0 +1,201 @@ +#!/usr/bin/ruby +# jsmin.rb 2007-07-20 +# Author: Uladzislau Latynski +# This work is a translation from C to Ruby of jsmin.c published by +# Douglas Crockford. Permission is hereby granted to use the Ruby +# version under the same conditions as the jsmin.c on which it is +# based. +# +# /* jsmin.c +# 2003-04-21 +# +# Copyright (c) 2002 Douglas Crockford (www.crockford.com) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# The Software shall be used for Good, not Evil. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +EOF = -1 +$theA = "" +$theB = "" + +# isAlphanum -- return true if the character is a letter, digit, underscore, +# dollar sign, or non-ASCII character +def isAlphanum(c) + return false if !c || c == EOF + return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || + (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || + c == '\\' || c[0] > 126) +end + +# get -- return the next character from stdin. Watch out for lookahead. If +# the character is a control character, translate it to a space or linefeed. +def get() + c = $stdin.getc + return EOF if(!c) + c = c.chr + return c if (c >= " " || c == "\n" || c.unpack("c") == EOF) + return "\n" if (c == "\r") + return " " +end + +# Get the next character without getting it. +def peek() + lookaheadChar = $stdin.getc + $stdin.ungetc(lookaheadChar) + return lookaheadChar.chr +end + +# mynext -- get the next character, excluding comments. +# peek() is used to see if a '/' is followed by a '/' or '*'. +def mynext() + c = get + if (c == "/") + if(peek == "/") + while(true) + c = get + if (c <= "\n") + return c + end + end + end + if(peek == "*") + get + while(true) + case get + when "*" + if (peek == "/") + get + return " " + end + when EOF + raise "Unterminated comment" + end + end + end + end + return c +end + + +# action -- do something! What you do is determined by the argument: 1 +# Output A. Copy B to A. Get the next B. 2 Copy B to A. Get the next B. +# (Delete A). 3 Get the next B. (Delete B). action treats a string as a +# single character. Wow! action recognizes a regular expression if it is +# preceded by ( or , or =. +def action(a) + if(a==1) + $stdout.write $theA + end + if(a==1 || a==2) + $theA = $theB + if ($theA == "\'" || $theA == "\"") + while (true) + $stdout.write $theA + $theA = get + break if ($theA == $theB) + raise "Unterminated string literal" if ($theA <= "\n") + if ($theA == "\\") + $stdout.write $theA + $theA = get + end + end + end + end + if(a==1 || a==2 || a==3) + $theB = mynext + if ($theB == "/" && ($theA == "(" || $theA == "," || $theA == "=" || + $theA == ":" || $theA == "[" || $theA == "!" || + $theA == "&" || $theA == "|" || $theA == "?" || + $theA == "{" || $theA == "}" || $theA == ";" || + $theA == "\n")) + $stdout.write $theA + $stdout.write $theB + while (true) + $theA = get + if ($theA == "/") + break + elsif ($theA == "\\") + $stdout.write $theA + $theA = get + elsif ($theA <= "\n") + raise "Unterminated RegExp Literal" + end + $stdout.write $theA + end + $theB = mynext + end + end +end + +# jsmin -- Copy the input to the output, deleting the characters which are +# insignificant to JavaScript. Comments will be removed. Tabs will be +# replaced with spaces. Carriage returns will be replaced with linefeeds. +# Most spaces and linefeeds will be removed. +def jsmin + $theA = "\n" + action(3) + while ($theA != EOF) + case $theA + when " " + if (isAlphanum($theB)) + action(1) + else + action(2) + end + when "\n" + case ($theB) + when "{","[","(","+","-" + action(1) + when " " + action(3) + else + if (isAlphanum($theB)) + action(1) + else + action(2) + end + end + else + case ($theB) + when " " + if (isAlphanum($theA)) + action(1) + else + action(3) + end + when "\n" + case ($theA) + when "}","]",")","+","-","\"","\\", "'", '"' + action(1) + else + if (isAlphanum($theA)) + action(1) + else + action(3) + end + end + else + action(1) + end + end + end +end + +jsmin Index: /freepbx/branches/ari_changes/buildtools/md5-amp_conf.sh =================================================================== --- /freepbx/branches/ari_changes/buildtools/md5-amp_conf.sh (revision 5124) +++ /freepbx/branches/ari_changes/buildtools/md5-amp_conf.sh (revision 5124) @@ -0,0 +1,18 @@ +#!/bin/bash +# use this script like: +# md5-amp_conf.sh 1.10.00X + +case "$1" in + ?*) + +cd ../amp_conf + +find agi-bin astetc bin cgi-bin htdocs htdocs_panel mohmp3 sbin sounds -type f | xargs md5sum | grep -v .svn > ../upgrades/$1.md5 + + ;; + *) + +echo "usage: md5-amp_conf "; + + ;; +esac Index: /freepbx/branches/ari_changes/LICENSE =================================================================== --- /freepbx/branches/ari_changes/LICENSE (revision 3392) +++ /freepbx/branches/ari_changes/LICENSE (revision 3392) @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. Index: /freepbx/branches/ari_changes/amp_conf/astetc/cdr_mysql.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/cdr_mysql.conf (revision 5723) +++ /freepbx/branches/ari_changes/amp_conf/astetc/cdr_mysql.conf (revision 5723) @@ -0,0 +1,20 @@ +; +; Note - if the database server is hosted on the same machine as the +; asterisk server, you can achieve a local Unix socket connection by +; setting hostname=localhost +; +; port and sock are both optional parameters. If hostname is specified +; and is not "localhost", then cdr_mysql will attempt to connect to the +; port specified or use the default port. If hostname is not specified +; or if hostname is "localhost", then cdr_mysql will attempt to connect +; to the socket file specified by sock or otherwise use the default socket +; file. +; +[global] +hostname=localhost +dbname=asteriskcdrdb +password=AMPDBPASS +user=AMPDBUSER +userfield=1 +;port=3306 +;sock=/tmp/mysql.sock Index: /freepbx/branches/ari_changes/amp_conf/astetc/modem.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/modem.conf (revision 8) +++ /freepbx/branches/ari_changes/amp_conf/astetc/modem.conf (revision 8) @@ -0,0 +1,74 @@ +; +; Internet Phone Jack +; +; Configuration file +; +[interfaces] +; +; By default, incoming calls should come in on the "remote" context +; +context=remote +; +; Modem Drivers to load +; +driver=aopen +; +; Default language +; +;language=en +; +; We can optionally override the auto detection. This is necessary +; particularly if asterisk does not know about our kind of modem. +; +;type=autodetect +;type=aopen +; +; We can strip a given number of digits on outgoing dialing, so, for example +; you can have it dial "8871042" when given "98871042". +; +stripmsd=1 +; +; Type of dialing +; +dialtype=tone +;dialtype=pulse +; +; Mode selection. "Immediate" means that as soon as you dial, you're connected +; and the line is considered up. "Ring" means we wait until the ring cadence +; occurs at least once. "Answer" means we wait until the other end picks up. +; +;mode=answer +;mode=ring +mode=immediate +; +; List all devices we can use. +; +;device => /dev/ttyS3 +; +; ISDN example +; +;msn=39907835 +;device => /dev/ttyI0 + +;=============== +; More complex ISDN example +; +; A single device which listens to 3 MSNs +; the wildcard '*' can be used when all MSN's should be accepted. +; (The incoming number can be used to go directly into the extension +; with the matching number. I.e. if MSN 33 is called, (context,33) +; will tried first, than (context,s) and finally (default,s). +; +;msn=50780020 +;incomingmsn=50780020,50780021,50780022 +;device => /dev/ttyI2 +; +; two other devices, which are in group '1' and are used when an +; outgoing dial used: exten => s,1,Dial,Modem/g1:1234|60|r +; (we do not need more outgoing devices, since ISDN2 has only 2 channels.) +; Lines can be in more than one group (1-31); comma seperated list. +; +group=1 ; group=1,2,3,9-12 +;msn=50780023 +;device => /dev/ttyI3 +;device => /dev/ttyI4 Index: /freepbx/branches/ari_changes/amp_conf/astetc/vm_general.inc =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/vm_general.inc (revision 745) +++ /freepbx/branches/ari_changes/amp_conf/astetc/vm_general.inc (revision 745) @@ -0,0 +1,15 @@ +; 1st listed format gets emailed +format=wav49|wav + +attach=yes +pbxskip=yes ; Don't put [PBX]: in the subject line +serveremail=vm@asterisk ; Who the e-mail notification should appear to come from +fromstring=Voicemail System ; Real name of email sender +maxmessage=180 ; max length of vm message +minmessage=3 ; Minimum length of a voicemail message in seconds +maxsilence=5 ; Wait for 5 silent seconds and end the voicemail +silencethreshold=128 ; What do we consider to be silence +skipms=3000 ; How many miliseconds to skip forward/back when rew/ff in message playback +review=yes ; Allow sender to review/rerecord their message before saving it +operator=yes ; Allow caller to press 0 +nextaftercmd=yes ; Automagically play next message when current message is deleted or saved Index: /freepbx/branches/ari_changes/amp_conf/astetc/enum.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/enum.conf (revision 190) +++ /freepbx/branches/ari_changes/amp_conf/astetc/enum.conf (revision 190) @@ -0,0 +1,4 @@ +[general] +search => e164.arpa +search => e164.org + Index: /freepbx/branches/ari_changes/amp_conf/astetc/indications.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/indications.conf (revision 2834) +++ /freepbx/branches/ari_changes/amp_conf/astetc/indications.conf (revision 2834) @@ -0,0 +1,708 @@ +; indications.conf +; Configuration file for location specific tone indications +; used by the pbx_indications module. +; +; NOTE: +; When adding countries to this file, please keep them in alphabetical +; order according to the 2-character country codes! +; +; The [general] category is for certain global variables. +; All other categories are interpreted as location specific indications +; +; +[general] +country=us ; default location + + +; [example] +; description = string +; The full name of your country, in English. +; alias = iso[,iso]* +; List of other countries 2-letter iso codes, which have the same +; tone indications. +; ringcadence = num[,num]* +; List of durations the physical bell rings. +; dial = tonelist +; Set of tones to be played when one picks up the hook. +; busy = tonelist +; Set of tones played when the receiving end is busy. +; congestion = tonelist +; Set of tones played when there is some congestion (on the network?) +; callwaiting = tonelist +; Set of tones played when there is a call waiting in the background. +; dialrecall = tonelist +; Not well defined; many phone systems play a recall dial tone after hook +; flash. +; record = tonelist +; Set of tones played when call recording is in progress. +; info = tonelist +; Set of tones played with special information messages (e.g., "number is +; out of service") +; 'name' = tonelist +; Every other variable will be available as a shortcut for the "PlayList" command +; but will not be used automatically by Asterisk. +; +; +; The tonelist itself is defined by a comma-separated sequence of elements. +; Each element consist of a frequency (f) with an optional duration (in ms) +; attached to it (f/duration). The frequency component may be a mixture of two +; frequencies (f1+f2) or a frequency modulated by another frequency (f1*f2). +; The implicit modulation depth is fixed at 90%, though. +; If the list element starts with a !, that element is NOT repeated, +; therefore, only if all elements start with !, the tonelist is time-limited, +; all others will repeat indefinitely. +; +; concisely: +; element = [!]freq[+|*freq2][/duration] +; tonelist = element[,element]* +; +; Please note that SPACES ARE NOT ALLOWED in tone lists! +; + +[at] +description = Austria +ringcadence = 1000,5000 +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +dial = 420 +busy = 420/400,0/400 +ring = 420/1000,0/5000 +congestion = 420/200,0/200 +callwaiting = 420/40,0/1960 +dialrecall = 420 +; RECORDTONE - not specified +record = 1400/80,0/14920 +info = 950/330,1450/330,1850/330,0/1000 +stutter = 380+420 + +[au] +description = Australia +; Reference http://www.acif.org.au/__data/page/3303/S002_2001.pdf +; Normal Ring +ringcadence = 400,200,400,2000 +; Distinctive Ring 1 - Forwarded Calls +; 400,400,200,200,400,1400 +; Distinctive Ring 2 - Selective Ring 2 + Operator + Recall +; 400,400,200,2000 +; Distinctive Ring 3 - Multiple Subscriber Number 1 +; 200,200,400,2200 +; Distinctive Ring 4 - Selective Ring 1 + Centrex +; 400,2600 +; Distinctive Ring 5 - Selective Ring 3 +; 400,400,200,400,200,1400 +; Distinctive Ring 6 - Multiple Subscriber Number 2 +; 200,400,200,200,400,1600 +; Distinctive Ring 7 - Multiple Subscriber Number 3 + Data Privacy +; 200,400,200,400,200,1600 +; Tones +dial = 413+438 +busy = 425/375,0/375 +ring = 413+438/400,0/200,413+438/400,0/2000 +; XXX Congestion: Should reduce by 10 db every other cadence XXX +congestion = 425/375,0/375,420/375,0/375 +callwaiting = 425/200,0/200,425/200,0/4400 +dialrecall = 413+438 +; Record tone used for Call Intrusion/Recording or Conference +record = !425/1000,!0/15000,425/360,0/15000 +info = 425/2500,0/500 +; Other Australian Tones +; The STD "pips" indicate the call is not an untimed local call +std = !525/100,!0/100,!525/100,!0/100,!525/100,!0/100,!525/100,!0/100,!525/100 +; Facility confirmation tone (eg. Call Forward Activated) +facility = 425 +; Message Waiting "stutter" dialtone +stutter = 413+438/100,0/40 +; Ringtone for calls to Telstra mobiles +ringmobile = 400+450/400,0/200,400+450/400,0/2000 + +[bg] +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +description = Bulgaria +ringdance = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/250,0/250 +callwaiting = 425/150,0/150,425/150,0/4000 +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +record = 1400/425,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +stutter = 425/1500,0/100 + +[br] +description = Brazil +ringcadence = 1000,4000 +dial = 425 +busy = 425/250,0/250 +ring = 425/1000,0/4000 +congestion = 425/250,0/250,425/750,0/250 +callwaiting = 425/50,0/1000 +; Dialrecall not used in Brazil standard (using UK standard) +dialrecall = 350+440 +; Record tone is not used in Brazil, use busy tone +record = 425/250,0/250 +; Info not used in Brazil standard (using UK standard) +info = 950/330,1400/330,1800/330 +stutter = 350+440 + +[be] +description = Belgium +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,3000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/3000 +congestion = 425/167,0/167 +callwaiting = 1400/175,0/175,1400/175,0/3500 +; DIALRECALL - not specified +dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" +; RECORDTONE - not specified +record = 1400/500,0/15000 +info = 900/330,1400/330,1800/330,0/1000 +stutter = 425/1000,0/250 + +[ch] +description = Switzerland +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/200,0/200,425/200,0/4000 +; DIALRECALL - not specified +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +; RECORDTONE - not specified +record = 1400/80,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +stutter = 425+340/1100,0/1100 + +[cl] +description = Chile +; According to specs from Telefonica CTC Chile +ringcadence = 1000,3000 +dial = 400 +busy = 400/500,0/500 +ring = 400/1000,0/3000 +congestion = 400/200,0/200 +callwaiting = 400/250,0/8750 +dialrecall = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400 +record = 1400/500,0/15000 +info = 950/333,1400/333,1800/333,0/1000 +stutter = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400 + +[cn] +description = China +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 450 +busy = 450/350,0/350 +ring = 450/1000,0/4000 +congestion = 450/700,0/700 +callwaiting = 450/400,0/4000 +dialrecall = 450 +record = 950/400,0/10000 +info = 450/100,0/100,450/100,0/100,450/100,0/100,450/400,0/400 +; STUTTER - not specified +stutter = 450+425 + +[cz] +description = Czech Republic +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425/330,0/330,425/660,0/660 +busy = 425/330,0/330 +ring = 425/1000,0/4000 +congestion = 425/165,0/165 +callwaiting = 425/330,0/9000 +; DIALRECALL - not specified +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425/330,0/330,425/660,0/660 +; RECORDTONE - not specified +record = 1400/500,0/14000 +info = 950/330,0/30,1400/330,0/30,1800/330,0/1000 +; STUTTER - not specified +stutter = 425/450,0/50 + +[de] +description = Germany +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425 +busy = 425/480,0/480 +ring = 425/1000,0/4000 +congestion = 425/240,0/240 +callwaiting = !425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,0 +; DIALRECALL - not specified +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +; RECORDTONE - not specified +record = 1400/80,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +stutter = 425+400 + +[dk] +description = Denmark +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = !425/200,!0/600,!425/200,!0/3000,!425/200,!0/200,!425/200,0 +; DIALRECALL - not specified +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +; RECORDTONE - not specified +record = 1400/80,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +; STUTTER - not specified +stutter = 425/450,0/50 + +[ee] +description = Estonia +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425 +busy = 425/300,0/300 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +; CALLWAIT not in accordance to ITU +callwaiting = 950/650,0/325,950/325,0/30,1400/1300,0/2600 +; DIALRECALL - not specified +dialrecall = 425/650,0/25 +; RECORDTONE - not specified +record = 1400/500,0/15000 +; INFO not in accordance to ITU +info = 950/650,0/325,950/325,0/30,1400/1300,0/2600 +; STUTTER not specified +stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 + +[es] +description = Spain +ringcadence = 1500,3000 +dial = 425 +busy = 425/200,0/200 +ring = 425/1500,0/3000 +congestion = 425/200,0/200,425/200,0/200,425/200,0/600 +callwaiting = 425/175,0/175,425/175,0/3500 +dialrecall = !425/200,!0/200,!425/200,!0/200,!425/200,!0/200,425 +record = 1400/500,0/15000 +info = 950/330,0/1000 +dialout = 500 + + +[fi] +description = Finland +ringcadence = 1000,4000 +dial = 425 +busy = 425/300,0/300 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/150,0/150,425/150,0/8000 +dialrecall = 425/650,0/25 +record = 1400/500,0/15000 +info = 950/650,0/325,950/325,0/30,1400/1300,0/2600 +stutter = 425/650,0/25 + +[fr] +description = France +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1500,3500 +; Dialtone can also be 440+330 +dial = 440 +busy = 440/500,0/500 +ring = 440/1500,0/3500 +; CONGESTION - not specified +congestion = 440/250,0/250 +callwait = 440/300,0/10000 +; DIALRECALL - not specified +dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 +; RECORDTONE - not specified +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330 +stutter = !440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,440 + +[gr] +description = Greece +ringcadence = 1000,4000 +dial = 425/200,0/300,425/700,0/800 +busy = 425/300,0/300 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/150,0/150,425/150,0/8000 +dialrecall = 425/650,0/25 +record = 1400/400,0/15000 +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 +stutter = 425/650,0/25 + +[hu] +description = Hungary +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1250,3750 +dial = 425 +busy = 425/300,0/300 +ring = 425/1250,0/3750 +congestion = 425/300,0/300 +callwaiting = 425/40,0/1960 +dialrecall = 425+450 +; RECORDTONE - not specified +record = 1400/400,0/15000 +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 +stutter = 350+375+400 + +[il] +description = Israel +ringcadence = 1000,3000 +dial = 414 +busy = 414/500,0/500 +ring = 414/1000,0/3000 +congestion = 414/250,0/250 +callwaiting = 414/100,0/100,414/100,0/100,414/600,0/3000 +dialrecall = !414/100,!0/100,!414/100,!0/100,!414/100,!0/100,414 +record = 1400/500,0/15000 +info = 1000/330,1400/330,1800/330,0/1000 +stutter = !414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,414 + + +[in] +description = India +ringcadence = 400,200,400,2000 +dial = 400*25 +busy = 400/750,0/750 +ring = 400*25/400,0/200,400*25/400,0/2000 +congestion = 400/250,0/250 +callwaiting = 400/200,0/100,400/200,0/7500 +dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330,0/1000 +stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 + +[it] +description = Italy +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425/200,0/200,425/600,0/1000 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/400,0/100,425/250,0/100,425/150,0/14000 +dialrecall = 470/400,425/400 +record = 1400/400,0/15000 +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 +stutter = 470/400,425/400 + +[lt] +description = Lithuania +ringcadence = 1000,4000 +dial = 425 +busy = 425/350,0/350 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/150,0/150,425/150,0/4000 +; DIALRECALL - not specified +dialrecall = 425/500,0/50 +; RECORDTONE - not specified +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 +; STUTTER - not specified +stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 + +[jp] +description = Japan +ringcadence = 1000,2000 +dial = 400 +busy = 400/500,0/500 +ring = 400+15/1000,0/2000 +congestion = 400/500,0/500 +callwaiting = 400+16/500,0/8000 +dialrecall = !400/200,!0/200,!400/200,!0/200,!400/200,!0/200,400 +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330,0 +stutter = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400 + +[mx] +description = Mexico +ringcadence = 2000,4000 +dial = 425 +busy = 425/250,0/250 +ring = 425/1000,0/4000 +congestion = 425/250,0/250 +callwaiting = 425/200,0/600,425/200,0/10000 +dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 +record = 1400/500,0/15000 +info = 950/330,0/30,1400/330,0/30,1800/330,0/1000 +stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 + +[my] +description = Malaysia +ringcadence = 2000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/400,0/200 +congestion = 425/500,0/500 + +[nl] +description = Netherlands +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +; Most of these 425's can also be 450's +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/250,0/250 +callwaiting = 425/500,0/9500 +; DIALRECALL - not specified +dialrecall = 425/500,0/50 +; RECORDTONE - not specified +record = 1400/500,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +stutter = 425/500,0/50 + +[no] +description = Norway +ringcadence = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/200,0/600,425/200,0/10000 +dialrecall = 470/400,425/400 +record = 1400/400,0/15000 +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 +stutter = 470/400,425/400 + +[nz] +description = New Zealand +;NOTE - the ITU has different tonesets for NZ, but according to some residents there, +; this is, indeed, the correct way to do it. +ringcadence = 400,200,400,2000 +dial = 400 +busy = 400/250,0/250 +ring = 400+450/400,0/200,400+450/400,0/2000 +congestion = 400/375,0/375 +callwaiting = !400/200,!0/3000,!400/200,!0/3000,!400/200,!0/3000,!400/200 +dialrecall = !400/100!0/100,!400/100,!0/100,!400/100,!0/100,400 +record = 1400/425,0/15000 +info = 400/750,0/100,400/750,0/100,400/750,0/100,400/750,0/400 +stutter = !400/100!0/100,!400/100,!0/100,!400/100,!0/100,!400/100!0/100,!400/100,!0/100,!400/100,!0/100,400 +unobtainable = 400/75,0/100,400/75,0/100,400/75,0/100,400/75,0/400 + +[pl] +description = Poland +ringcadence = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/500,0/500 +callwaiting = 425/150,0/150,425/150,0/4000 +; DIALRECALL - not specified +dialrecall = 425/500,0/50 +; RECORDTONE - not specified +record = 1400/500,0/15000 +; 950/1400/1800 3x0.33 on 1.0 off repeated 3 times +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000 +; STUTTER - not specified +stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 + +[pt] +description = Portugal +ringcadence = 1000,5000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/5000 +congestion = 425/200,0/200 +callwaiting = 440/300,0/10000 +dialrecall = 425/1000,0/200 +record = 1400/500,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 + +[ru] +description = Russia / ex Soviet Union +ringcadence = 800,3200 +dial = 425 +busy = 425/350,0/350 +ring = 425/800,0/3200 +congestion = 425/350,0/350 +callwaiting = 425/200,0/5000 +dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330,0 + +[se] +description = Sweden +ringcadence = 1000,5000 +dial = 425 +busy = 425/250,0/250 +ring = 425/1000,0/5000 +congestion = 425/250,0/750 +callwaiting = 425/200,0/500,425/200,0/9100 +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +record = 1400/500,0/15000 +info = !950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,0 +stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +; stutter = 425/320,0/20 ; Real swedish standard, not used for now + +[sg] +description = Singapore +; Singapore +; Reference: http://www.ida.gov.sg/idaweb/doc/download/I397/ida_ts_pstn1_i4r2.pdf +; Frequency specs are: 425 Hz +/- 20Hz; 24 Hz +/- 2Hz; modulation depth 100%; SIT +/- 50Hz +ringcadence = 400,200,400,2000 +dial = 425 +ring = 425*24/400,0/200,425*24/400,0/2000 ; modulation should be 100%, not 90% +busy = 425/750,0/750 +congestion = 425/250,0/250 +callwaiting = 425*24/300,0/200,425*24/300,0/3200 +stutter = !425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,425 +info = 950/330,1400/330,1800/330,0/1000 ; not currently in use acc. to reference +dialrecall = 425*24/500,0/500,425/500,0/2500 ; unspecified in IDA reference, use repeating Holding Tone A,B +record = 1400/500,0/15000 ; unspecified in IDA reference, use 0.5s tone every 15s +; additionally defined in reference +nutone = 425/2500,0/500 +intrusion = 425/250,0/2000 +warning = 425/624,0/4376 ; end of period tone, warning +acceptance = 425/125,0/125 +holdinga = !425*24/500,!0/500 ; followed by holdingb +holdingb = !425/500,!0/2500 + +[th] +description = Thailand +ringcadence = 1000,4000 +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +dial = 400*50 +busy = 400/500,0/500 +ring = 420/1000,0/5000 +congestion = 400/300,0/300 +callwaiting = 1000/400,10000/400,1000/400 +; DIALRECALL - not specified - use special dial tone instead. +dialrecall = 400*50/400,0/100,400*50/400,0/100 +; RECORDTONE - not specified +record = 1400/500,0/15000 +; INFO - specified as an announcement - use special information tones instead +info = 950/330,1400/330,1800/330 +; STUTTER - not specified +stutter = !400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,400 + +[uk] +description = United Kingdom +ringcadence = 400,200,400,2000 +; These are the official tones taken from BT SIN350. The actual tones +; used by BT include some volume differences so sound slightly different +; from Asterisk-generated ones. +dial = 350+440 +; Special dial is the intermittent dial tone heard when, for example, +; you have a divert active on the line +specialdial = 350+440/750,440/750 +; Busy is also called "Engaged" +busy = 400/375,0/375 +; "Congestion" is the Beep-bip engaged tone +congestion = 400/400,0/350,400/225,0/525 +; "Special Congestion" is not used by BT very often if at all +specialcongestion = 400/200,1004/300 +unobtainable = 400 +ring = 400+450/400,0/200,400+450/400,0/2000 +callwaiting = 400/100,0/4000 +; BT seem to use "Special Call Waiting" rather than just "Call Waiting" tones +specialcallwaiting = 400/250,0/250,400/250,0/250,400/250,0/5000 +; "Pips" used by BT on payphones. (Sounds wrong, but this is what BT claim it +; is and I've not used a payphone for years) +creditexpired = 400/125,0/125 +; These two are used to confirm/reject service requests on exchanges that +; don't do voice announcements. +confirm = 1400 +switching = 400/200,0/400,400/2000,0/400 +; This is the three rising tones Doo-dah-dee "Special Information Tone", +; usually followed by the BT woman saying an appropriate message. +info = 950/330,0/15,1400/330,0/15,1800/330,0/1000 +; Not listed in SIN350 +record = 1400/500,0/60000 +stutter = 350+440/750,440/750 + +[us] +description = United States / North America +ringcadence = 2000,4000 +dial = 350+440 +busy = 480+620/500,0/500 +ring = 440+480/2000,0/4000 +congestion = 480+620/250,0/250 +callwaiting = 440/300,0/10000 +dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330,0 +stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 + +[us-old] +description = United States Circa 1950/ North America +ringcadence = 2000,4000 +dial = 600*120 +busy = 500*100/500,0/500 +ring = 420*40/2000,0/4000 +congestion = 500*100/250,0/250 +callwaiting = 440/300,0/10000 +dialrecall = !600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,600*120 +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330,0 +stutter = !600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,600*120 + +[tw] +description = Taiwan +; http://nemesis.lonestar.org/reference/telecom/signaling/dialtone.html +; http://nemesis.lonestar.org/reference/telecom/signaling/busy.html +; http://www.iproducts.com.tw/ee/kylink/06ky-1000a.htm +; http://www.pbx-manufacturer.com/ky120dx.htm +; http://www.nettwerked.net/tones.txt +; http://www.cisco.com/univercd/cc/td/doc/product/tel_pswt/vco_prod/taiw_sup/taiw2.htm +; +; busy tone 480+620Hz 0.5 sec. on ,0.5 sec. off +; reorder tone 480+620Hz 0.25 sec. on,0.25 sec. off +; ringing tone 440+480Hz 1 sec. on ,2 sec. off +; +ringcadence = 1000,4000 +dial = 350+440 +busy = 480+620/500,0/500 +ring = 440+480/1000,0/2000 +congestion = 480+620/250,0/250 +callwaiting = 350+440/250,0/250,350+440/250,0/3250 +dialrecall = 300/1500,0/500 +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330,0 +stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 + +[ve] +; Tone definition source for ve found on +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +description = Venezuela / South America +ringcadence = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/250,0/250 +callwaiting = 400+450/300,0/6000 +dialrecall = 425 +record = 1400/500,0/15000 +info = !950/330,!1440/330,!1800/330,0/1000 + + +[za] +description = South Africa +; http://www.cisco.com/univercd/cc/td/doc/product/tel_pswt/vco_prod/safr_sup/saf02.htm +; (definitions for other countries can also be found there) +; Note, though, that South Africa uses two switch types in their network -- +; Alcatel switches -- mainly in the Western Cape, and Siemens elsewhere. +; The former use 383+417 in dial, ringback etc. The latter use 400*33 +; I've provided both, uncomment the ones you prefer +ringcadence = 400,200,400,2000 +; dial/ring/callwaiting for the Siemens switches: +dial = 400*33 +ring = 400*33/400,0/200,400*33/400,0/2000 +callwaiting = 400*33/250,0/250,400*33/250,0/250,400*33/250,0/250,400*33/250,0/250 +; dial/ring/callwaiting for the Alcatel switches: +; dial = 383+417 +; ring = 383+417/400,0/200,383+417/400,0/2000 +; callwaiting = 383+417/250,0/250,383+417/250,0/250,383+417/250,0/250,383+417/250,0/250 +congestion = 400/250,0/250 +busy = 400/500,0/500 +dialrecall = 350+440 +; XXX Not sure about the RECORDTONE +record = 1400/500,0/10000 +info = 950/330,1400/330,1800/330,0/330 +stutter = !400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,400*33 + Index: /freepbx/branches/ari_changes/amp_conf/astetc/rtp.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/rtp.conf (revision 1725) +++ /freepbx/branches/ari_changes/amp_conf/astetc/rtp.conf (revision 1725) @@ -0,0 +1,9 @@ +; +; RTP Configuration +; +[general] +; +; RTP start and RTP end configure start and end addresses +; +rtpstart=10000 +rtpend=20000 Index: /freepbx/branches/ari_changes/amp_conf/astetc/queues.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/queues.conf (revision 4993) +++ /freepbx/branches/ari_changes/amp_conf/astetc/queues.conf (revision 4993) @@ -0,0 +1,20 @@ +[general] +; +; Global settings for call queues +; (none exist currently) +; +; Note that a timeout to fail out of a queue may be passed as part of application call +; from extensions.conf: +; Queue(queuename|[options]|[optionalurl]|[announceoverride]|[timeout]) +; example: Queue(dave|t|||45) +#include queues_general_additional.conf +#include queues_custom_general.conf + +[default] +; +; Default settings for queues (currently unused) +; + +#include queues_custom.conf +#include queues_additional.conf +#include queues_post_custom.conf Index: /freepbx/branches/ari_changes/amp_conf/astetc/freepbx_module_admin.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/freepbx_module_admin.conf (revision 6125) +++ /freepbx/branches/ari_changes/amp_conf/astetc/freepbx_module_admin.conf (revision 6125) @@ -0,0 +1,21 @@ +; This file is used to hide modules from the Module Admin +; GUI that you do not want to have appear there. Its main +; purpose is to keep modules that you never plan on +; installing from appearing in the gui. +; +; The format is standard ini file format such as where +; all the modules appear in a general section at the +; top and each is listed with the word 'hidden' if it is +; not to appear in the GUI. At this time that is the +; only supported attribute. +; +; The module's 'rawname' is used for the key, so for +; example to keep the Speed Dial and Phone book modules +; from appearing, you would have two lines in the general +; section that looked like: +; [general] +; speeddial=hidden +; phonebook=hidden +; +[general] +builtin=hidden Index: /freepbx/branches/ari_changes/amp_conf/astetc/modules.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/modules.conf (revision 2472) +++ /freepbx/branches/ari_changes/amp_conf/astetc/modules.conf (revision 2472) @@ -0,0 +1,53 @@ +; +; Asterisk configuration file +; +; Module Loader configuration file +; + +[modules] +autoload=yes +; +; If you want, load the GTK console right away. +; Don't load the KDE console since +; it's not as sophisticated right now. +; +noload => pbx_gtkconsole.so +;load => pbx_gtkconsole.so +noload => pbx_kdeconsole.so +; +; Intercom application is obsoleted by +; chan_oss. Don't load it. +; +noload => app_intercom.so +; +; DON'T load the chan_modem.so, as they are obsolete in * 1.2 + +noload => chan_modem.so +noload => chan_modem_aopen.so +noload => chan_modem_bestdata.so +noload => chan_modem_i4l.so + +; Trunkisavail is a broken module supplied by Trixbox +noload => app_trunkisavail.so + +; Ensure that format_* modules are loaded before res_musiconhold +;load => format_ogg_vorbis.so +load => format_wav.so +load => format_pcm.so +load => format_au.so +; This isn't part of 'asterisk' iteslf, it's part of asterisk-addons. If this isn't +; installed, asterisk will fail to start. But it does need to go here for native MOH +; to work using mp3's. +load => format_mp3.so +load => res_musiconhold.so +; +; Load either OSS or ALSA, not both +; By default, load OSS only (automatically) and do not load ALSA +; +noload => chan_alsa.so +noload => chan_oss.so +; +; Module names listed in "global" section will have symbols globally +; exported to modules loaded after them. +; +[global] Index: /freepbx/branches/ari_changes/amp_conf/astetc/phpagi.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/phpagi.conf (revision 8) +++ /freepbx/branches/ari_changes/amp_conf/astetc/phpagi.conf (revision 8) @@ -0,0 +1,3 @@ +[festival] +text2wave=/usr/src/festival/bin/text2wave +tempdir=/var/lib/asterisk/sounds/tmp/ Index: /freepbx/branches/ari_changes/amp_conf/astetc/extensions_custom.conf.sample =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/extensions_custom.conf.sample (revision 5723) +++ /freepbx/branches/ari_changes/amp_conf/astetc/extensions_custom.conf.sample (revision 5723) @@ -0,0 +1,28 @@ +; This file contains example extensions_custom.conf entries. +; extensions_custom.conf should be used to include customizations +; to AMP's Asterisk dialplan. + +; Extensions in AMP have access to the 'from-internal' context. +; The context 'from-internal-custom' is included in 'from-internal' by default + +[from-internal-custom] +exten => 1234,1,Playback(demo-congrats) ; extensions can dial 1234 +exten => 1234,2,Hangup() +exten => h,1,Hangup() +include => custom-recordme ; extensions can also dial 5678 + +; custom-count2four,s,1 can be used as a custom target for +; a Digital Receptionist menu or a Ring Group +[custom-count2four] +exten => s,1,SayDigits(1234) +exten => s,2,Hangup + +; custom-recordme,5678,1 can be used as a custom target for +; a Digital Receptionist menu or a Ring Group +[custom-recordme] +exten => 5678,1,Wait(2) +exten => 5678,2,Record(/tmp/asterisk-recording:gsm) +exten => 5678,3,Wait(2) +exten => 5678,4,Playback(/tmp/asterisk-recording) +exten => 5678,5,Wait(2) +exten => 5678,6,Hangup Index: /freepbx/branches/ari_changes/amp_conf/astetc/phone.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/phone.conf (revision 8) +++ /freepbx/branches/ari_changes/amp_conf/astetc/phone.conf (revision 8) @@ -0,0 +1,47 @@ +; +; Linux Telephony Interface +; +; Configuration file +; +[interfaces] +; +; Select a mode, either the phone jack provides dialtone, reads digits, +; then starts PBX with the given extension (dialtone mode), or +; immediately provides the PBX without reading any digits or providing +; any dialtone (this is the immediate mode, the default). Also, you +; can set the mode to "fxo" if you have a linejack to make it operate +; properly. +; +mode=immediate +;mode=dialtone +;mode=fxo +; +; You can decide which format to use by default, "g723.1" or "slinear". +; XXX Be careful, sometimes the card causes kernel panics when running +; in signed linear mode for some reason... XXX +; +;format=slinear +format=g723.1 +; +; And set the echo cancellation to "off", "low", "medium", and "high". +; This is not supported on all phones. +; +echocancel=medium +; +; You can optionally use VAD/CNG silence supression +; +;silencesupression=yes +; +; List all devices we can use. Contexts may also be specified +; +;context=local +; +; You can set txgain and rxgain for each device in the same way as context. +; If you want to change default gain value (1.0 =~ 100%) for device, simple +; add txgain or rxgain line before device line. But rememeber, if you change +; volume all cards listed below will be affected by these values. You can +; use float values (1.0, 0.5, 2.0) or percentage values (100%, 150%, 50%). +; +;txgain=100% +;rxgain=1.0 +;device => /dev/phone0 Index: /freepbx/branches/ari_changes/amp_conf/astetc/manager.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/manager.conf (revision 1785) +++ /freepbx/branches/ari_changes/amp_conf/astetc/manager.conf (revision 1785) @@ -0,0 +1,17 @@ +; +; Asterisk Call Management support +; +[general] +enabled = yes +port = 5038 +bindaddr = 0.0.0.0 + +[AMPMGRUSER] +secret = AMPMGRPASS +deny=0.0.0.0/0.0.0.0 +permit=127.0.0.1/255.255.255.0 +read = system,call,log,verbose,command,agent,user +write = system,call,log,verbose,command,agent,user + +#include manager_additional.conf +#include manager_custom.conf Index: /freepbx/branches/ari_changes/amp_conf/astetc/meetme.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/meetme.conf (revision 8) +++ /freepbx/branches/ari_changes/amp_conf/astetc/meetme.conf (revision 8) @@ -0,0 +1,2 @@ +[rooms] +#include meetme_additional.conf Index: /freepbx/branches/ari_changes/amp_conf/astetc/vm_email.inc =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/vm_email.inc (revision 1253) +++ /freepbx/branches/ari_changes/amp_conf/astetc/vm_email.inc (revision 1253) @@ -0,0 +1,5 @@ +; Change the email body, variables: VM_NAME, VM_DUR, VM_MSGNUM, VM_MAILBOX, VM_CALLERID, VM_DATE + +emailbody=${VM_NAME},\n\nThere is a new voicemail in mailbox ${VM_MAILBOX}:\n\n\tFrom:\t${VM_CALLERID}\n\tLength:\t${VM_DUR} seconds\n\tDate:\t${VM_DATE}\n\nDial *98 to access your voicemail by phone.\nVisit http://AMPWEBADDRESS/recordings/index.php to check your voicemail with a web browser.\n + + Index: /freepbx/branches/ari_changes/amp_conf/astetc/privacy.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/privacy.conf (revision 8) +++ /freepbx/branches/ari_changes/amp_conf/astetc/privacy.conf (revision 8) @@ -0,0 +1,3 @@ +[general] + +maxretries = 2 ;How many chances the caller has to enter their number Index: /freepbx/branches/ari_changes/amp_conf/astetc/logger.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/logger.conf (revision 8) +++ /freepbx/branches/ari_changes/amp_conf/astetc/logger.conf (revision 8) @@ -0,0 +1,36 @@ +; +; Logging Configuration +; +; In this file, you configure logging to files or to +; the syslog system. +; +; For each file, specify what to log. +; +; For console logging, you set options at start of +; Asterisk with -v for verbose and -d for debug +; See 'asterisk -h' for more information. +; +; Directory for log files is configures in asterisk.conf +; option astlogdir +; +[logfiles] +; +; Format is "filename" and then "levels" of debugging to be included: +; debug +; notice +; warning +; error +; verbose +; +; Special filename "console" represents the system console +; +;debug => debug +;console => notice,warning,error +;console => notice,warning,error,debug +;messages => notice,warning,error +full => notice,warning,error,debug,verbose + +;syslog keyword : This special keyword logs to syslog facility +; +;syslog.local0 => notice,warning,error +; Index: /freepbx/branches/ari_changes/amp_conf/astetc/voicemail.conf.template =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/voicemail.conf.template (revision 8) +++ /freepbx/branches/ari_changes/amp_conf/astetc/voicemail.conf.template (revision 8) @@ -0,0 +1,5 @@ +[general] +#include vm_general.inc +#include vm_email.inc +[default] + Index: /freepbx/branches/ari_changes/amp_conf/astetc/musiconhold.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/musiconhold.conf (revision 2448) +++ /freepbx/branches/ari_changes/amp_conf/astetc/musiconhold.conf (revision 2448) @@ -0,0 +1,7 @@ +; +; Music on hold class definitions +; This is using the new 1.2 config file format, and will not work with 1.0 +; based Asterisk systems +; +#include musiconhold_custom.conf +#include musiconhold_additional.conf Index: /freepbx/branches/ari_changes/amp_conf/astetc/freepbx_featurecodes.conf =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/freepbx_featurecodes.conf (revision 5991) +++ /freepbx/branches/ari_changes/amp_conf/astetc/freepbx_featurecodes.conf (revision 5991) @@ -0,0 +1,39 @@ +; Feature Code Default Override Configuration File +; +; freepbx_featurecodes.conf +; +; This file is used to override the default featurecode values provided +; by each FreePBX module. It will not change modified values. This can +; be used to localize featurecodes different from those chosen by each +; module and hardcoded into the system. +; +; The format is standard ini file format where each section is a raw +; modulename and each entry under a section is the featurecode. +; +; You can typically see the feature codes present in a module by looking +; at their install.php script or otherwise look at the featurecodes sql +; table. +; +; As an example, the module donotdisturb, you will see some entries in +; the install.php script that look like: +; +; $fcc = new featurecode('donotdisturb', 'dnd_on'); +; $fcc = new featurecode('donotdisturb', 'dnd_off'); +; $fcc = new featurecode('donotdisturb', 'dnd_toggle'); +; +; To override those featurecodes to something *21, *22 and *23, you would +; create standard ini entries such as: +; +; [donnotdisturb] +; dnd_on = *21 +; dnd_off = *22 +; dnd_toggle = *23 +; +; FreePBX will then begin using those entries. You will seem them displayed +; on the Featurecode Admin page and next time a configuration is generated +; they should be updated in the featurecode sql table. +; +; This ini file must remain in place since modules regularly reset such +; codes when new versions are uploaded but the presence of this file and +; its settings will override any such changes +; Index: /freepbx/branches/ari_changes/amp_conf/astetc/zapata.conf.template =================================================================== --- /freepbx/branches/ari_changes/amp_conf/astetc/zapata.conf.template (revision 390) +++ /freepbx/branches/ari_changes/amp_conf/astetc/zapata.conf.template (revision 390) @@ -0,0 +1,34 @@ +;# Flash Operator Panel will parse this file for zap trunk buttons +;# AMPLABEL will be used for the display labels on the buttons + +;# %c Zap Channel number +;# %n Line number +;# %N Line number, but restart counter +;# Example: +;# ;AMPLABEL:Channel %c - Button %n + +;# For Zap/* buttons use the following +;# (where x=number of buttons to dislpay) +;# ;AMPWILDCARDLABEL(x):MyLabel + + +[channels] +language=en + +; include zap extensions defined in AMP +#include zapata_additional.conf + +; XTDM20B Port #1,2 plugged into PSTN +;AMPLABEL:Channel %c - Button %n +context=from-pstn +signalling=fxs_ks +faxdetect=incoming +usecallerid=yes +echocancel=yes +echocancelwhenbridged=no +echotraining=800 +group=0 +channel=1-2 + + + Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/LICENSE =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/LICENSE (revision 7) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/LICENSE (revision 7) @@ -0,0 +1,341 @@ + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_de.cfg =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_de.cfg (revision 583) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_de.cfg (revision 583) @@ -0,0 +1,31 @@ +; German Language configuration file +dialing=Waehlt +calling=Ruft $1 +incoming=Eingehendes Gespraech von $1 +parked=Gehalten auf $1 +registered=Registriert +notregistered=Nicht registriert +reachable=$1 erreichbar +unreachable=$1 nicht erreichbar +lagged=$1 verzoegert +newold=$1 neue, $2 alte +waitingonqueue=$1 Nutzer warten +memberonconference=$1 Teilnehmer +version_mismatch=Client/Server Versionsfehler! +; client side +clid_label=Info +detail_title=Letzte Anrufdetails +detail_from=Von: +detail_to=An: +detail_duration=Dauer: +security_code_title=Bitte den Sicherheitscode eingeben +btn_security_text=Eingabe Sicherheitscode +btn_restart_text=Asterisk-Neustart +btn_reload_text=Konfiguration neu laden +btn_debug_text=Debug-Fenster ein/aus +btn_help_text=Hilfefenster oeffnen +tab_call_text=Anruf +tab_queue_text=Warteschlange +calls_taken_text=Angenommene Anrufe +no_data_text=Keine Daten vorhanden +debug_window_title=Debug-Fenster Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/UPGRADE =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/UPGRADE (revision 2500) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/UPGRADE (revision 2500) @@ -0,0 +1,555 @@ +Notes on upgrading from an older release +======================================== + +o Upgrading from version .25 to .26: + + New DTHML client. The directory structure on the tarball has changed + to accommodate the new DHTML client. The former html subdirectory was + renamed to flash, and the new client is inside the dhtml subdirectory. + + The new DHTLM client works in a similar way to the flash client, it has + a couple of scripts that read the same config files than the flash + version to draw the buttons. It is not yet complete but it mostly works. + + New parameter in op_style.cfg: + + shake_pixels + Sets the number of pixels to shake the icon when ringing + + dimm_noregister_by + Ammount of alpha dimm to apply when channel is not registred + + dimm_lagged_by + Ammount of alpha dimm to apply when channel is lagged + + New parameters in op_buttons.cfg: + + VoiceMailExt + To set the extension@context to use when transferring directly + to voicemail + + Background + To specify a jpg image to use as button background. You have to + set No_rectangle=true on that button for the background to become + active. The .jpg file should be of the same size as the button width + and height as specified in op_style.cfg + + Privacy + If set to true, it won't display caller id or dialed number info + for that button. + +o Upgrading from version .24 to .25: + + Queue buttons now must be defined as: + + [QUEUE/SUPPORT] + + With this new syntax, queue names with numbers + only as used in AMP will work without collisions. + + You have to rename all queue buttons in your config + file to use the new syntax or they won't work. + + Added some attributes to LEGENDS in op_buttons.cfg: + + URL + TARGET + NO_BASE64 + + If set, the legend will become an hyperlink to URL@TARGET + If NO_BASE64 is set, the text won't be encoded + + Added attributes to any button in op_buttons.cfg: + + URL + TARGET + + If set, it will add an hyperlink to the button label pointing + to that URL and opening it inside TARGET. + + Added enable_label_background to op_style.cfg + + This parameter will set the background color to the button label + to the same colors as the led. You can use it together with + "no_rectangle" in the buttons and Icon=0 and a small width, height + and font to fit hundreds of buttons on one screen. I was able to + fit 630 buttons (but only for monitoring as you don't have the led + or icon to transfer or hangup calls) + + Added dimm (alpha) for noregistered and lagged buttons to op_style.cfg + + dimm_noregister_by=20 + dimm_lagged_by=60 + + Added listen_addr keyword + If you want op_server.pl to bind to only one IP address instead of + all avaialbe addresses. + + Added manager_port keyword + + If your manager is not running on the default port, you + can specify the port now for each connection with this + option. Example: + + manager_port = 5039 + + Added support for astmanproxy + + In op_server.cfg you have to defined the astmanproxy host & port + (the ip address where astmanproxy is listening) & server (the + same ip or name you use in astmanproxy.conf). If you + monitor more than one asterisk server trough astmanproxy, you + will have to enumerate them using the astmanproxy_server keyword. + Example: + + astmanproxy_host = 127.0.0.1 + astmanproxy_port = 1234 + astmanproxy_server = 192.168.10.1 + astmanproxy_server = 192.168.10.2 + + Added buttons for MEETME participants. Just specify more + than one position for a meetme button and they will show + meetme participants indiviually as they join or leave the + conference. + + Added [QUEUEAGENT] buttons. They will be taken by static + or dynamic queue members automatically. + + Added buttons for QUEUE positions. Just specify more than + one position for the button and they will show each queue + position instead of a queue summary + + +o Upgrading from version .23 to .24: + + Nothing new, just a bug fix release in op_server.pl + +o Upgrading from version .22 to .23: + + Client and server must be upgraded or it will not work well. + + Internationalization support: + + Parameter ADDED to op_server.cfg: + + language + + To set the language to use in the general section + and optionally in every panel context defined. + + The language files are named op_lang_XX.cfg where XX is the + language to use defined in the language option. Each panel + context might have a distinct language. The default language + is 'en' (english). + + You can create your own language file. If you do, please + send it back to me so I can include it in the tarball. + Some strings include variables, they are represented as + $1 and $2. You can ommit the variables or use them as you + see fit. + + The help file is now called help-XX.html. Be sure to add that file + or rename the one you have. Please contribute with translations or + beautifying them if you can. + + Parameters REMOVED from op_style.cfg (they were moved to the language + configuration file): + + clid_label + detail_title + detail_from + detail_to + detail_duration + + Parameters ADDED to op_style.cfg (to set the button label color, the + button label shadow color, and the clid text color): + + label_font_color = 000000 + label_shadow_color = FFFFFF + clid_font_color = 00DD00 + timer_font_color = 200070 + + New option for LEGENDS in op_buttons.cfg + + font_color = 102030 + + Support for command line options. Run op_server.pl with --help to + see the available options + + +o Upgrading from version .21 to .22: + + Just replace op_server.pl that has minor bugfixes + +o Upgrading from version .20 to .21: + New configuration file: op_astdb.cfg used to monitor asterisk + db values and change states for a button based on them. + + New option: voicemail_extension parameter in op_server.cfg. + If set, FOP will originate a call to that extension when + double clicking on the MWI icon. + + The PARK buttons are now specified as PARK/XXX + instead of PARKXXX to make it more consistent with + channel naming conventions. The old name will still + work. + + To enable agent_status (displays agent idle + time and refresh queue status after each + call). In op_server.cfg: + + agent_status=1 + + + If there is a background.jpg image in the same + directory as the swf file, it will be used as + the background for the panel. Resolution: 996x600 + + The syntax for wildcard buttons has changed, if + you have [SIP/*] change it to [_SIP/.*] + The new matching routine allows full regexps to + be used. To use regexps buttons start them with + an underscore followed by your expression. + + To disable the security code, leave it blank. In + op_server.cfg: + security_code = "" + + To enable timeout on transfers, you have to set the + transfer_timeout paramenter to op_server.cfg + + You can set the reload button to perform an asterisk + restart if you set enable_restart to 1 in op_server.cfg + +o Upgrading from version .19 to .20: + + You can define the server number of a button in op_buttons.cfg + using the 'server' directive. If you leave it empty, it will + default to Server=1 + + To monitor more than one asterisk box, just repeat the sequence of + connection parameters in op_server.cfg + + ; Server 1 + manager_host=1.2.3.4 + manager_user=john + manager_secret=doe + + ; Server 2 + manager_host=1.2.3.5 + manager_user=mary + manager_secret=poppins + + To add text legends, the format is: + + [LEGEND] + x=535 + y=50 + text=Conferences + font_size=32 + font_family=Arial + use_embed_fonts=1 + + To add park slot buttons, the format is: + + [PARK701] + Position=17 + Icon=3 + Extension=700 + Label="Park 701" + + You can specify the mailbox for a button with the mailbox parameter: + + [SIP/100] + Position=1 + Mailbox=100@default + ... + + The 'old way' still works, by using the combination of Extension and + Voicemail_Context. I recommend you to use the new format as it is more + flexible (you can monitor a mailbox independant from the extension of + that button). + + + New directives in op_server.cfg + + rename_label_wildcard + barge_muted + clid_privacy + show_ip + +o Upgrading from version .18 to .19: + + In op_style.cfg there is a new paramter to confgure the + highlighting color for the buttons: + + btn_highlight_color=ff0000 + +o Upgrading from version .17 to .18: + + The default .swf client is now the ming port. The new features + are available only in the ming port. The flash .swf is included + but it was not tested. + + In op_style.cfg there are new parameters (to configure led colors): + + ledcolor_ready + ledcolor_busy + ledcolor_agent + + The parameter led_color is not used anymore. (It is used by the + flash client only, not the default ming client) + + In op_server.cfg there are new options too (all commented in + op_server.cfg itsef): + + rename_label_agentlogin + rename_label_callbacklogin + rename_to_agent_name + rename_queue_member + change_led_agent + clicktodial_insecure + + It is possible now to draw rectangles, see op_buttons.cfg for + an example. + + If you use click-to-dial, the button used to originate the call + must be specified when invoking the .swf file. The parameter used + is 'dial'. See index-clicktodial.html for an example. + +o Upgrading from version .16 to .17: + + Just replace op_server.pl and your favorite .swf client. Its + mostly a bug fix release. The new features do not require + configuration changes. + +o Upgrading from version .15 to .16: + + The help window is now a browser windows that loads help.html + (instead of being a flash window that loads the help.txt file) + So you need to put a help.html page in the same location as the + .swf file. + + There are a couple of new parameters. In op_server.cfg + + poll_voicemail + + Will check for voicemail status every poll_interval seconds. + Remeber that poll_interval will also check for sip peers. + + rename_label_agentlogin + rename_label_callbacklogin + + Both parameters acomplish the same goal: to rename a button + label when an Agent logs in. One of them works with the regular + AgentLogin application. The other one with AgentCallbackLogin. + For the later, you need to have a button with the same extension + and context for the callback for it to work. + + There is also a new parameter in op_style.cfg + + enable_crypto (1 for enable, 0 for disable) + + If you want to encrypt server to client messages, turn this on. + +o Upgrading from version .14 to .15: + + The format of the configuration file is different. You have to + run ./convert_config_pre_14.pl in order to convert your old + configuration files to the new format. The conversion utility + must reside in the same directory as the old configuration files: + + op_server.cfg + op_style.cfg + op_buttons.cfg + + When you run the conversion routine, it will backup your old + configuration files and do its thing. Just in case, backup the + files yourself. The conversion program does not have extensive + error checking. + + The barge-in functionality has changed also. You no longer need + an auto_conference_extension in your dialplan. The panel will + keep track of the conferences itself. You *do* need to add the + conference room numbers that must be used for barge-in. The + conversion routine adds the parameter, you have to modify it to + suit your needs. The new parameter (in op_server.cfg) is: + + barge_rooms + + It must have at least two rooms defined, with the format: + "minor-major". Those rooms must be defined in your extensions.conf + under the context defined by conference_context. The extension + number must match the meetme room number. See op_server.cfg for + an example. + + To authenticate using MD5 to Asterisk Manager you can add the parameter + auth_md5=1 in op_server.cfg. It is enabled by default. + + There are new parameter in op_style.cfg: + + enable_animation: it will animate the phone icons when ringing. + + use_embed_font: lets you choose between embed fonts or system fonts. + + (1 for enable, 0 for disable) + + +o Upgrading from version .13 to .14: + + In Asterisk RC1, the IAX naming convention has changed. There are + no more brackets in IAX2 channel names. If you run RC1 (try it!) + you will have to name your IAX2 channels like: + + IAX2/user + + You will have to rename your op_buttons.cfg if you use IAX2 channels. + + The code for handling the previous naming convention is still there + but I have not tested it. It might or might not work. + + There are new elements in op_style that affects the button style: + + arrow_scale + arrow_margin_top + arrow_margin_left + + The above parameters indicate the size and position of a little + arrow that shows the 'direction' of the call. + + detail_title=Last call details + detail_from=From: + detail_to=To: + detail_duration=Duration: + + These four parameters are for setting the text displayed in the + detail box when you double click on the little arrow after a call + is made. + + led_color + + The color scheme for the available/busy led. + 0 for leds green/red. (default) + 1 for leds grey/green + + label_shadow + + You can add a shadow to the text label + 0 for disabling the shadow (default) + 1 for enabling the shadow + + + There is a new parameter in op_server.cfg: + + clid_format + + This mask will apply to the callerid field to format the + number as you see fit. Every 'x' will be replaced by a number + from right to left. Any other char will be preserved. Ex: + (xxx) xxx-xxxx + +o Upgrading from version .12 to .13: + + For the timer to work, you need to add four new parameters to + op_style.cfg + + timer_font_size + timer_font_family + timer_margin_top + timer_margin_left + +o Upgrading from version .11 to .12: + + There are 4 new parameters in op_style.cfg for the caller id + display on each button. + + clid_font_size + clid_font_family + clid_margin_top + clid_margin_left + +o Upgrading from version .10 to .11: + + There are no new parameters in the configuration files. Your .10 + configuration should work fine with version .11 + + The debug level bitmap is now different: + + 1 Show Manager Events Received + 2 Show Commands set to Manager + 4 Show Flash events Received + 8 Show events sent to Flash Clients + 16 1st level Debug on op_server.pl + 32 2nd level Debug on op_server.pl + 64 3rd level Debug on op_server.pl + +o Upgrading from version .09 to .10: + + There are 2 new parameters in op_style.cfg for a new element + in the toolbar (a reload button) + + btn_reload_label + show_btn_reload + + +o Upgrading from version .08 to .09: + + The debug level (op_server.cfg) is now a bitmap. Now you have more + control of the output produced by debug. The possible values are: + + 1 Show Manager Events Received + 2 Show Commands set to Manager + 4 1st level debug on op_server.pl + 8 2nd level debug on op_server.pl + 16 3rd level debug on op_server.pl + + If you want full debug, set the value to 31 in op_server.cfg + If you want to see just the events received and sent, set it to 3 (1+2) + + The fade matrix for the buttons is slightly different. Its the first + step towards a visual button layout configurator. + +o Upgrading from version .07 to .08: + + The offset and size of the icons have changed. You will need to adjust + your op_style.cfg. Now all the icons are aproximatly the same size and + have the same center offset, so the margins and scale parameters will + match from icon to icon. New layout configurations should be simpler. + + There are several new parameters in op_style.cfg, related to the + configurability of the toolbar. You have to add them in your current + configuration, if you don't do it you will not see any toolbar. The + parameters to add are: + + clid_label=Extra Info: + security_label=Security Code: + btn_help_label=Help + btn_log_label=Debug + show_security_code=1 + show_clid_info=2 + show_status=3 + show_btn_help=4 + show_btn_debug=5 + + The number in show_xxx represents the order in which it is rendered. If + you want to hide an element of the toolbar, set it to 0. + +o Upgrading from version .06 to .07: + + There are two new parameters in op_server.cfg: + + auto_conference_extension = 900 + conference_context = conferences + + Add them to your existing configuration file. In op_server.cfg there are + also examples of asterisk configuration files to use the 3way auto + conferences. + +o Upgrading from previous versions: + + There are three new parameters in op_sytle.cfg and a new one in + op_buttons.cfg. See CHANGES. Just add those parameters to your current + config files, and replace op_server.pl with the new one. The fixed 24 + buttons flash movie does not support voicemail notifications. There is a + new index.html that scales the applet to the size of the browser window. + Try it and use the one you like more. Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/convert_config_pre_14.pl =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/convert_config_pre_14.pl (revision 25) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/convert_config_pre_14.pl (revision 25) @@ -0,0 +1,147 @@ +#!/usr/bin/perl + +sub copy +{ + $oldfile = shift; + $newfile = shift; + + open(IN, "< $oldfile") or die "can't open $oldfile: $!"; + open(OUT, "> $newfile") or die "can't open $newfile: $!"; + + $blksize = (stat IN)[11] || 16384; # preferred block size? + while ($len = sysread IN, $buf, $blksize) + { + if (!defined $len) + { + next if $! =~ /^Interrupted/; # ^Z and fg + die "System read error: $!\n"; + } + $offset = 0; + while ($len) + { # Handle partial writes. + defined($written = syswrite OUT, $buf, $len, $offset) + or die "System write error: $!\n"; + $len -= $written; + $offset += $written; + } + } + + close(IN); + close(OUT); +} + +copy("op_buttons.cfg", "op_buttons.cfg.bak"); +copy("op_style.cfg", "op_style.cfg.bak"); +copy("op_server.cfg", "op_server.cfg.bak"); + +open(NEWCONF, ">op_buttons.cfg.new"); + +open(CONFIG, "< op_buttons.cfg") + or die("Could not open op_buttons.cfg. Aborting..."); + +while () +{ + chop; + $_ =~ s/^\s+//g; + if (/^#/ || /^;/ || /^$/) { next; } # Ignores comments and empty lines + + ($channel, $position, $label, $extension, $icon, $vmail_context) = + split(/,/, $_); + $channel =~ s/\s+//g; + $position =~ s/\s+//g; + $position =~ s/;/,/g; + $extension =~ s/\s+//g; + $vmail_context =~ s/\s+//g; + $icon =~ s/\s+//g; + $label =~ s/^\s+//g; + + if ($position =~ /\@/) + { + ($parte1, $parte2) = split(/\@/, $position); + $position = $parte1; + $panel_context = $parte2; + } + else + { + $panel_context = ""; + } + + if ($extension =~ /\@/) + { + ($parte1, $parte2) = split(/\@/, $extension); + $extension = $parte1; + $contexto = $parte2; + } + else + { + $contexto = ""; + } + + print NEWCONF "[$channel]\n"; + print NEWCONF "Position=$position\n"; + print NEWCONF "Label=$label\n"; + print NEWCONF "Extension=$extension\n"; + print NEWCONF "Context=$contexto\n" if ($contexto ne ""); + print NEWCONF "Icon=$icon\n"; + print NEWCONF "Panel_Context=$panel_context\n" if ($panel_context ne ""); + print NEWCONF "Voicemail_Context=$vmail_context\n" + if ($vmail_context ne ""); + print NEWCONF "\n"; +} +close(CONFIG); +close(NEWCONF); + +open(NEWCONF, ">op_server.cfg.new"); +print NEWCONF "[general]\n"; +open(CONFIG, ") +{ + $_ =~ s/\s+//g; + $_ =~ s/(.*)#.*/$1/g; + if (!/^$/) + { + my ($variable_name, $value) = split(/=/, $_); + $variable_name =~ tr/A-Z/a-z/; + $value =~ s/\"//g; + print NEWCONF "$variable_name=$value\n" + unless ($variable_name =~ /auto_conference_extension/); + } +} +print NEWCONF "auth_md5=1\n"; +print NEWCONF "barge_rooms=900-910\n"; +close(CONFIG); +close(NEWCONF); + +open(NEWCONF, ">op_style.cfg.new"); +print NEWCONF "[general]\n"; +print NEWCONF "enable_animation=1\n"; +open(CONFIG, ") +{ + $_ =~ s/(.*)#.*/$1/g; + if (!/^$/) + { + my ($variable_name, $value) = split(/=/, $_); + $variable_name =~ s/\s+//g; + $variable_name =~ tr/A-Z/a-z/; + $value =~ s/\"//g; + chomp($value); + print NEWCONF "$variable_name=$value\n" + unless ( $variable_name =~ /btn_help_label/ + || $variable_name =~ /btn_reload_label/ + || $variable_name =~ /btn_help_label/ + || $variable_name =~ /security_label/); + } +} +close(CONFIG); +close(NEWCONF); + +copy("op_buttons.cfg.new", "op_buttons.cfg"); +copy("op_style.cfg.new", "op_style.cfg"); +copy("op_server.cfg.new", "op_server.cfg"); + +unlink("op_buttons.cfg.new"); +unlink("op_style.cfg.new"); +unlink("op_server.cfg.new"); Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_astdb.cfg =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_astdb.cfg (revision 448) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_astdb.cfg (revision 448) @@ -0,0 +1,30 @@ +; FOP will ask for the value of the asterisk database families +; specified between brackets. If the value is non empty, it will +; send the commands to the flash client. Note that the family +; is case sensitive! + +[dnd] +settext=DND: ${value} +setalpha=70 +flip=1 +fopledcolor=0x001020 + +[cfb] +settext=CFB: ${value} +status=busy ; free, busy, ringing +fopledcolor=0x102030 + +# How it works: when the panel is first started, it will check +# for every family defined in op_astdb.cfg between brakets. The +# key is the channel name, as defined between brackets in op_buttons.cfg +# If a value is found and non empty it will perform the actions +# specified in op_astdb.cfg, those actions modify the button for +# that channel in FOP, they are: +# +# settext = sets the text where the callerid is displayed +# setlabel = sets the label for the button +# setalpha = sets the alpha blending for the whole button (0-100) +# flip = flips the button (1) +# state = set the state of the led to: free, busy or ringing +# fopledcolor = sets the led color using hex values like 0x2030a0 + Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/RECIPES =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/RECIPES (revision 448) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/RECIPES (revision 448) @@ -0,0 +1,101 @@ +RECIPE 1 +-------- +Set DND (Do not disturb) from your dialplan and +reflect the status on FOP: + +# Example on setting DND state from the dialplan +# *78 Sets DND ON +# *79 Sets DND OFF +# +# This example only sets the dnd db value and +# signals FOP to display the status on the button +# you might have to add a check in your stdexten +# macro to honour the DND status + +in extensions.conf: + +exten => *78,1,UserEvent(ASTDB|Family: dnd^State: On) +exten => *78,2,SetVar(temp=${CHANNEL}) +exten => *78,3,Cut(temp=temp,,1) +exten => *78,4,DBPut(dnd/${temp}=On) +exten => *78,5,Hangup + +exten => *79,1,UserEvent(ASTDB|Family: dnd^State: ^) +exten => *79,2,SetVar(temp=${CHANNEL}) +exten => *79,3,Cut(temp=temp,,1) +exten => *79,4,DBDel(dnd/${temp}) +exten => *79,5,Hangup + +in op_astdb.cfg: +[dnd] +settext=DND: ${value} +setalpha=70 + +RECIPE 2 +-------- +How to monitor rxfax. This is just a barebones sample, you can +customize it for your needs. You have to Goto to the fax context +from your dialplan: + +in extensions.conf: + +exten => fax,1,Goto(rxfax,s,1) + +[rxfax] +exten => s,1,SetVar(FAXFILE=/var/spool/fax/fax-${TIMESTAMP}.tif) +exten => s,2,SetVar(LOCALSTATIONID=My Company) +exten => s,3,UserEvent(Newexten|Channel: FAX/FAX-${UNIQUEID}^State: Up^Uniqueid: 1234) +exten => s,4,rxfax(${FAXFILE}) +exten => s,5,Hangup() +exten => t,1,Hangup() +exten => h,1,UserEvent(Hangup|Channel: FAX/FAX-${UNIQUEID}^State: Down^Uniqueid: 1234) + +in op_buttons.cfg: +[FAX/FAX] +Position=1 +Label="Fax" + + + +RECIPE 3 +-------- +How to monitor voicemailmain (users entering the voicemail application) +You have to define a regular extensions that performs a 'Goto' to the +vmail context (similar to the fax case above) + +in extensions.conf: + +[vmail] +exten => s,1,SetLanguage(es) +exten => s,2,UserEvent(Newexten|Channel: VMAIL/VMAIL-${UNIQUEID}^State: Up^Uniqueid: 4321) +exten => s,3,VoicemailMain(${CALLERIDNUM}@internos) +exten => t,1,Hangup +exten => h,1,NoOp(Hangup en voicemail) +exten => h,2,UserEvent(Hangup|Channel: VMAIL/VMAIL-${UNIQUEID}^State: Down^Uniqueid: 4321) +exten => h,3,Hangup + +in op_buttons.cfg: + +[VMAIL/VMAIL] +Position=1 +Label="Voicemail" + +RECIPE 4 +-------- +Show day/night mode based on an asterisk db value: + +in extensions.conf: + +exten => 80,1,DBPut(daymode/DAYMODE=Day); +exten => 80,2,UserEvent(ASTDB|Family: daymode^Channel: daymode^Value: Day) +exten => 80,3,Hangup +; +exten => 81,1,DBPut(daymode/DAYMODE=Night); +exten => 81,2,UserEvent(ASTDB|Family: daymode^Channel: daymode^Value: Night) +exten => 81,3,Hangup + +in op_astdb.cfg: + +[daymode] +setlabel=${value} + Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/index_amp.php =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/index_amp.php (revision 981) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/index_amp.php (revision 981) @@ -0,0 +1,52 @@ + + + + +Flash Operator Panel + + + + + + + + + + + + + Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_buttons.cfg =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_buttons.cfg (revision 6180) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_buttons.cfg (revision 6180) @@ -0,0 +1,117 @@ +include => op_buttons_additional.cfg + +; use this for your customizations to FOP +include => op_buttons_custom.cfg + +; Old values now auto-generated: + +; Queues +;[rectangle] +;x=492 +;y=32 +;width=491 +;height=111 +;line_width=0 +;line_color=ff1010 +;fade_color1=ff1010 +;fade_color2=a01000 +;rnd_border=2 +;alpha=20 +;layer=bottom + +; Conferences +;[rectangle] +;x=492 +;y=144 +;width=491 +;height=111 +;line_width=0 +;line_color=006666 +;fade_color1=006666 +;fade_color2=a01000 +;rnd_border=2 +;alpha=20 +;layer=bottom + +; Parking +;[rectangle] +;x=492 +;y=256 +;width=491 +;height=84 +;line_width=0 +;line_color=ffff10 +;fade_color1=ffff10 +;fade_color2=CC9933 +;rnd_border=2 +;alpha=20 +;layer=bottom + + +; Trunks +;[rectangle] +;x=492 +;y=341 +;width=491 +;height=255 +;line_width=0 +;line_color=10ff10 +;fade_color1=10ff10 +;fade_color2=009900 +;rnd_border=2 +;alpha=20 +;layer=bottom + +; Extensions +;[rectangle] +;x=-1 +;y=32 +;width=491 +;height=564 +;line_width=0 +;line_color=1010ff +;fade_color1=1010ff +;fade_color2=99CCCC +;rnd_border=2 +;alpha=10 +;layer=bottom + +;[LEGEND] +;x=500 +;y=342 +;text=Trunks +;font_size=18 +;font_family=Times New Roman +;use_embed_fonts=1 + +;[LEGEND] +;x=500 +;y=144 +;text=Conferences +;font_size=18 +;font_family=Arial +;use_embed_fonts=1 + +;[LEGEND] +;x=500 +;y=256 +;text=Parking lots +;font_size=18 +;font_family=Arial +;use_embed_fonts=1 + +;[LEGEND] +;x=500 +;y=32 +;text=Queues +;font_size=18 +;font_family=Arial +;use_embed_fonts=1 + +;[LEGEND] +;x=10 +;y=32 +;text=Extensions +;font_size=18 +;font_family=Arial +;use_embed_fonts=1 Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_style.cfg =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_style.cfg (revision 4993) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_style.cfg (revision 4993) @@ -0,0 +1,126 @@ +[general] +; Fade out buttons for state +dimm_noregister_by=20 +dimm_lagged_by=60 + +; Fade mwi when no mail is waiting +nomail_alpha=3 + +; If enabled, the phone will shake/ring +enable_animation=1 + +; Pixels to use on the ringing animtion +shake_pixels=2 + +; Show borders around text labels, useful for debugin style +show_borders=0 + +; If set, the label backdround will change to the led state color +enable_label_background=0 + +; set to 1 for encrypting server to client communications +enable_crypto=1 + +; use the font embeded in the flash movie instead of system fonts +use_embed_fonts=1 + +; colors for led states +ledcolor_ready=0x00A000 +ledcolor_busy=0xA01020 +ledcolor_agent=0xD0d020 +ledcolor_paused=0x000000 + +; Settings for the button (rectangle) +btn_width=244 +btn_height=26 +btn_padding=2 +btn_line_width=2 +btn_line_color=F79418 +btn_fadecolor_1=ccccff +btn_fadecolor_2=2973FF +btn_round_border=8 +;btn_highlight_color=ff0000 +btn_highlight_color=F79418 + +; Settings affecting the button label +label_font_size=11 +label_font_family=Verdana ; only valid when use_embed_fonts is disabled +label_font_color=000000 +label_shadow_color=dddddd +label_margin_top=0 +label_margin_left=35 +label_shadow=1 +label_extent_x=10 ; If the label does not fit horizontally, increase this number +label_extent_y=0 + + +; Settings affecting the button clid +clid_font_color=00dd00 +clid_font_size=11 +clid_centered=1 +clid_font_family=Verdana +clid_margin_top=11 +clid_margin_left=35 + +; Settings for the timer +timer_font_color=4000ff +timer_font_size=11 +timer_font_family=Verdana +timer_margin_top=11 +timer_margin_left=160 + +; Settings for the oval led +led_scale=60 +led_margin_top=10 +led_margin_left=20 + +; Settings for the arrow +arrow_scale=60 +arrow_margin_top=5 +arrow_margin_left=5 + +; Settings for MWI Icon +mail_margin_left=-40 +mail_margin_top=13 +mail_scale=4 + +; Settings for icons +icon1_margin_top=10 +icon1_margin_left=-15 +icon1_scale=6 + +icon2_margin_top=10 +icon2_margin_left=-15 +icon2_scale=6 + +icon3_margin_top=10 +icon3_margin_left=-15 +icon3_scale=6 + +icon4_margin_top=10 +icon4_margin_left=-15 +icon4_scale=6 + +icon5_margin_top=10 +icon5_margin_left=-15 +icon5_scale=6 + +icon6_margin_top=10 +icon6_margin_left=-15 +icon6_scale=6 + +; Settings for Status Bar at the top +show_security_code=1 +show_clid_info=0 +show_btn_help=3 +show_btn_debug=0 +show_btn_reload=2 +show_status=4 + +;[sip] +; You can have different styles per panel context +; You need to copy all the variables, they will not be +; inherited. If you fail to include an option the flash +; client migth hang. So, copy the complete [general] +; section an change the header to the panel context name. +; Then adjust the parameters to your liking. Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/README =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/README (revision 448) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/README (revision 448) @@ -0,0 +1,189 @@ +Asterisk Flash Operator Panel +Copyright (c) 2004 Nicolás Gudiño. All rights reserved. +http://www.asternic.org + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +For complete and up to date documentation, please visit the web page +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +What is Flash Operator Panel? +----------------------------- + +The Flash Operator panel is a 'switchboard' application for the Asterisk PBX +system. It displays information about your Asterisk PBX activity in real +time via a standard web browser with Flash plugin. The display and button +layout is configurable, you can have more than a 100 buttons on the screen +at once. + +You can see at a glance: + + * What extensions are busy, ringing or available + * Who is talking and to whom (clid, context, priority) + * SIP registration status and reachability + * Meetme room status (number of users) in the room + * Queue status (number of users waiting) + * Parked extensions + * Call duration Timers + * Logged in Agents + +You can perform these actions: + + * Hang-up a channel (double click the colored dot on the button) + * Transfer a call leg via drag&drop (drag the phone icon on a button to + another button) + * Originate calls via drag&drop + * Drag an available extension to an ongoing conversation and conference + the three together. + * Change the callerid text to something meaningfull when transferring or + originating a call + * Mute/Unmute meetme participants + +Requirements +------------ + +* You need PERL and basic knowledge on how to use Asterisk. + +* You have to add a user to asterisk's manager.conf and reload asterisk for + the changes to take effect. + +* For the conference buttons, message waiting indication and automatic three + way conferences, you need asterisk CVS-HEAD as of 5/25/2004 + +* You need flash player versions 7 and up + +* You also need to define in your dialplan the conferences in a proper way + and in their own context, as explained in op_server.cfg comments. + +* If you plan to use the "Info" box to set the callerid text when + transferring or originating a call, you need to modify your dialplan. See + extensions.conf.sample + +* You also need to be wary, as English is not my first language. + + +Install +------- + +1) Copy the files in the html subdirectory to a suitable place on your web + server. If your web root is /var/www/html, you can create a subdirectory + 'panel' and copy the files there. + + There are two index and two applets, try them and use the one you like + more. You can modify the file help.txt, just be sure to left the "text=" + as the first part of the file. You can use some basic html tags also. + +2) Edit op_server.cfg and change the appropriate parameters for your setup. + + "flash_dir" parameter must be the exact location of the directory where + the html and swf files are placed. + + "web_hostname" must be the same hostname you use to access the web + server. Eg: if you access the web server using 'http://www.myserver.com' + then web_hostname must be 'www.myserver.com'. If you use an IP address + instead of a name, you should write that IP. + + The rest of the parameters are well commented in the cfg file + +3) Edit op_buttons.cfg to suit your needs. The file is commented and its + self explanatory. + +4) Edit op_style.cfg to suit your needs. You can change the button size and + colors, icon placement and size, etc. DO NOT modify the variable names, + just the value after the equal sign and DO NOT use spaces. With proper + adjusting, you can have more than a 100 buttons on the screen. + + You can change the toolbar layout by changing the number after the + variable show_???. Each one represents a possible element in the toolbar. + A value of 0 disables that element. A number represents the order in the + toolbar it will be displayed, number one being the leftmost part of the + toolbar. In the example configuration, all the toolbar elements are + displayed in correlative order. Eg: if you do not want to display a DEBUG + button, set the 'show_btn_debug' to 0. You can translate the text of the + toolbar in the corresponding variables. + + --!! Please note !!--------------------------------------------------- + If you want to transfer an available channel to an already connected + call, you have to configure your dialplan correctly and have the + context properly defined, if you don't do that you will experience + hanged channels and asterisk lockups. Thats because when you redirect + a call within the asterisk manager with an incorrect contexts, + asterisk does not handle the error gracefully. + --!!----------------------------------------------------------------- + + +International Characters +------------------------ + +If you want to display foreign characters in button labels, you have to save +the configuration file with UTF-8 encoding. To convert the file to UTF-8 +utilizing vi and the command line just perform: + +vi -c ":wq! ++enc=utf8" op_buttons.cfg + + +Running +------- + +The op_server.pl must run on the same computer as the web server + +When started, it writes the file 'variables.txt' to the http directory where +the flash applet is installed with configuration data. It must have +permissions to write to that directory. + +You can run it daemonized using -d as its command line argument. There are +some example init scripts in the directory inits + +If you want to start the server when the machine starts, you can add a line +similar to the following to your rc.local file (you have to replace the +values between '*' with the ones for your system, if you do not want to run +the op_server.pl as root, just su to that user: + +(cd */path/*; su *operator-user* -c */path/*op_server.pl & ) + +Or better yet, use one of the init scripts provided. + + +Security +-------- + +Its not meant to be secure. You should take provisions yourself, like +limiting who can connect by means of .htaccess files, firewall rules, etc. +There is basic encryption for messages sent from the server to the client, +and the security code is sent with MD5. It will hide sensitive information +from the casual observer, but its not strong enough to send credit card +information. + + +How to use it +------------- + +Click the HELP button when running the Flash Operator Panel. Experiment. +Drag icons, move your mouse around. Click and double click when the arrow +turns into a hand. + + +Support +------- + +For support or submitting bug reports, features requests, etc, please +subscribe to the mailing list by sending an empty email to +operator_panel-subscribe@lists.house.com.ar + +Donations +--------- + +If you like the program, or have feature requests, you can contribute to the +cause by donating via paypal. Click the donate button on the webpage. You can +also contact me for custom works, or asterisk consultancy. + +Thanks! + + +Credits +------- + +MD5 Algorithm. Copyright: +(C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. + +TEA Encryption algorithm: +Copyright (c) 2000, Peter J Billam c/o P J B Computing, www.pjb.com.au Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/index.php =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/index.php (revision 770) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/index.php (revision 770) @@ -0,0 +1,51 @@ + + + + +Flash Operator Panel + + + + + + + + + + + + + Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_en.cfg =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_en.cfg (revision 583) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_en.cfg (revision 583) @@ -0,0 +1,31 @@ +; Language configuration file +dialing=Dialing +calling=Calling $1 +incoming=Incoming call from $1 +parked=Parked on $1 +registered=Registered +notregistered=Not registered +reachable=Reachable $1 +unreachable=Not reachable $1 +lagged=Lagged $1 +newold=New $1, Old $2 +waitingonqueue=$1 user$2 waiting +memberonconference=$1 participant$2 +version_mismatch=Client/Server version mismatch! +; client side +clid_label=Info +detail_title=Last call details +detail_from=From: +detail_to=To: +detail_duration=Duration: +security_code_title=Please enter the security code +btn_security_text=Open Security Code Input Box +btn_restart_text=Restarts Asterisk +btn_reload_text=Reloads configuration +btn_debug_text=Open/Close Debug Window +btn_help_text=Open Help Window +tab_call_text=Call +tab_queue_text=Queue +calls_taken_text=Calls taken +no_data_text=No data available +debug_window_title=Debug Window Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_server.cfg =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_server.cfg (revision 6146) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_server.cfg (revision 6146) @@ -0,0 +1,198 @@ +; NOTE +; +; In this config file, the following entries will be IGNORED, in +; favour of the values set in /etc/amportal.conf (but do not +; comment them !): +; manager_user, manager_secret, web_hostname, security_code, flash_dir + + +[general] +use_amportal_conf=1 +; host or ip address of asterisk +manager_host=127.0.0.1 + +; user and secret for connecting to * manager +manager_user=UNUSED +manager_secret=UNUSED + +; The optional event_mask for filtering manager events. +; Asterisk will send only the events you request +; with this parameter. Possible values are: +; on, off, system, call, log, verbose +;event_mask=call +; +; You can specify many asterisk servers to +; monitor. Just repeat the manager_host, manager_user +; and manager_secret parameters in order. The first +; one will be server number 1, and so on. +; +; manager_host=1.2.3.4 +; manager_user=john +; manager_secret=doe + +; Enable MD5 auth to Asterisk manager +auth_md5=1 + +; port to listen for inbound flash connections, default 4445 +;listen_port=4445 + +; hostname or ip address used to connect to the webserver where +; the flash movie resides (just the hostname, without directories) +; This value might be omited. In that case the flash movie will +; try to connect to the same host as the web page. +web_hostname=UNUSED + +; location of the .swf file in your disk (must reside somewhere +; inside your web root) +flash_dir=UNUSED + +; secret code for performing hangups and transfers +security_code=UNUSED + +; Frequency in second to poll for sip and iax status +poll_interval=120 + +; Poll for voicemail status (only necesary when you access the +; voicemail directories outside asterisk itself - eg. web access) +poll_voicemail=1 + +; 1 Enable automatic hangup of zombies +; 0 Disable +kill_zombies=0 + +; Debug level to stdout (bitmap) +; 1 Manager Events Received +; 2 Manager Commands Sent +; 4 Show Flash events Received +; 8 Show events sent to Flash Clients +; 16 Server 1st Debug Level +; 32 Server 2nd Debug Level +; 64 Server 3rd Debug Level +; +; Eg: to display manager events and +; commands sent set it to 3 (1+2) +; +; Maximum debug level 255 +debug=0 + +; Default language to use (op_lang_XX.cfg file) +language=en + +; Context in your diaplan where you have the conferences for barge in +; Example: +; +; meetme.conf +; [rooms] +; conf => 900 +; conf => 901 +; conf => 902 +; +; extensions.conf +; [conferences] +; exten => 900,1,MeetMe(900) +; exten => 901,1,MeetMe(901) +; exten => 902,1,MeetMe(902) +conference_context=conferences + +; Meetme room numbers to use for barge in. The room number must match +; the extension number (see above). +barge_rooms=900-902 + +; When doing barge ins, you can make the 3rd party to start +; the meetme muted, so the other parties wont notice they are +; now being monitored +barge_muted=1 + +; Formatting of the callerid field +; where 'x' is a number +clid_format=(xxx)xxx-xxxx + +; If you want not to show the callerid on the buttons, set this +; to one +clid_privacy=0 + +; To display the ip address of sip or iax peer inside the button +; set this to 1 +show_ip=0 + +; Will change the button label on AgentLogin +rename_label_agentlogin=0 + +; Will change the button label on Agentcallbacklogin +rename_label_callbacklogin=0 + +; Will rename the label for a wildcard button +rename_label_wildcard=0 + +; Will rename to the name specified in agents.conf +; If disabled the renaming will be Agent/XXXX +rename_to_agent_name=1 + +; Will display IDLE time for agents, as well as +; update the queue status after an agent hangs up +; the call, so you don't need to reload to get +; queue statistics +agent_status=0 + +; Will rename labels for queuemembers +; If you use addqueuemember in your dialplan, you +; can fake an AgengLogin event by sending it with +; the UserEvent application. Eg: +; +; exten => 25,1,AddQueueMember(sales|SIP/${CALLERIDNUM} +; exten => 25,2,UserEvent(Agentlogin|Agent: ${CALLERIDNUM}); +; exten => 25,3,Answer +; exten => 25,4,Playback(added-to-sales-queue) +; exten => 25,5,Hangup +; +; exten => 26,1,RemoveQueueMember(sales|SIP/${CALLERIDNUM}) +; exten => 26,2,UserEvent(RefreshQueue); +; exten => 26,3,Answer +; exten => 26,4,Playback(removed-from-sales-queue) +; exten => 26,5,Hangup +rename_queue_member=0 + +; Will change the led color when the agent logs in +; The color is configurable in op_style.cfg +change_led_agent=1 + +; If set to 1, you will transfer the linked channel instead +; of the current channel when you drag the icon on a button +reverse_transfer=0 + +; If enabled, it will not ask forthe security code +; when performing a click to dial +clicktodial_insecure=1 + +; Enable select box with absolutetimeout for the call after +; a transfer is performed within the panel +transfer_timeout= "0,No timeout|300,5 minutes|600,10 minutes|1200,20 minutes|2400,40 minutes|3000,50 minutes" + +; If set to 1, when hitting the reload button on the flash +; client it will instead restart the 1st asterisk box +; (For asterisk to restart you have to start it with +; safe_asterisk, if you dont do that, asterisk will just +; shut down) +enable_restart = 0 + +; If you set this parameter to your voicemailmain +; extension@context, it will originate a call to +; voicemailmain when double clicking on the MWI icon +; for any button. +voicemail_extension = *97@app-vmmain + +; You can have panel contexts with their own +; button layout and configuration. The following entry +; will create a context called sip with a different +; security code. In the online documentation you will +; find how to use contexts +; +;[sip] +;security_code=djdjdi43 +;web_hostname=www.virtualwebserver.com +;flash_dir=/var/www/virtualwebserver/html/panel +;barge_rooms=800-802 +;conference_context=otherconferences +;transfer_timeout="0,No timeout|60,1 minute" +;voicemail_extension=1000@nine +;language=es Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/safe_opserver =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/safe_opserver (revision 4993) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/safe_opserver (revision 4993) @@ -0,0 +1,7 @@ +#!/usr/bin/env sh +. /etc/amportal.conf + +while true; do +$FOPWEBROOT/op_server.pl +sleep 4 +done Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/extensions.conf.sample =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/extensions.conf.sample (revision 448) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/extensions.conf.sample (revision 448) @@ -0,0 +1,46 @@ +# +# Example entry for setting a callerid text comming +# from the flash operator panel +# You have to modify line 1 and 3 to match the channel +# name for that extension: temp=clid should remain untouched. +# +# If the variable does not exist in the database +# (if was not set by the operator panel) the line +# 1 jumps to priority n+101, to perform a normal +# dial without setting the CallerIDName + +exten => 11,1,DBget(temp=clid/SIP/11) +exten => 11,2,SetCIDName(${temp}) +exten => 11,3,DBdel(clid/SIP/11) +exten => 11,4,Dial(SIP/11,30,TrH) +exten => 11,5,Hangup + +; gets here if there was not 'info' provided +exten => 11,102,Dial(SIP/11,30,TrH) + +; busy from the dial +exten => 11,105,Busy +exten => 11,203,Busy + + +# Example on setting DND state from the dialplan +# *78 Sets DND ON +# *79 Sets DND OFF +# +# This example only sets the dnd db value and +# signals FOP to display the status on the button +# you might have to add a check in your stdext +# macro to honour the DND status + +exten => *78,1,UserEvent(ASTDB|Family: dnd^State: On) +exten => *78,2,SetVar(temp=${CHANNEL}) +exten => *78,3,Cut(temp=temp,,1) +exten => *78,4,DBPut(dnd/${temp}=On) +exten => *78,5,Hangup + +exten => *79,1,UserEvent(ASTDB|Family: dnd^State: ^) +exten => *79,2,SetVar(temp=${CHANNEL}) +exten => *79,3,Cut(temp=temp,,1) +exten => *79,4,DBDel(dnd/${temp}) +exten => *79,5,Hangup + Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_es.cfg =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_es.cfg (revision 583) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_es.cfg (revision 583) @@ -0,0 +1,31 @@ +; Language configuration file +dialing=Marcando +calling=Llamando a $1 +incoming=Recibiendo llamada de $1 +parked=Aparcado en $1 +registered=Registrado +notregistered=No registrado +reachable =Alcanzable $1 +unreachable=No alcanzable $1 +lagged=Demorado $1 +newold=Nuevos $1, Viejos $2 +waitingonqueue=$1 usuario$2 esperando +memberonconference=$1 participante$2 +version_mismatch=Version incorrecta entre Cliente y Servidor! +; client side +clid_label=CLID +detail_title=Detalles ultimo llamado +detail_from=De: +detail_to=A: +detail_duration=Duracion: +security_code_title=Ingrese el codigo de seguridad +btn_security_text=Abre ventana de ingreso de codigo +btn_restart_text=Reinicia Asterisk +btn_reload_text=Recarga la configuracion +btn_debug_text=Abre/Cierra ventana de Debug +btn_help_text=Abre ayuda +tab_call_text=Llamada +tab_queue_text=Cola +calls_taken_text=Llamados atendidos +no_data_text=No hay datos +debug_window_title=Ventana de Debug Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/TODO =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/TODO (revision 582) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/TODO (revision 582) @@ -0,0 +1,8 @@ +* Clean bugs +* A way to set astdb values from the .swf +* A way to perform any cli or manager action from the .swf +* Go to Astricon USA with more help +* Change user authentication and restrictions methods +* Get some sleep +* Make a client in JAVA +* Make a windows systray client Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/help.txt =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/help.txt (revision 7) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/help.txt (revision 7) @@ -0,0 +1,15 @@ +text=Before performing actions, you need to enter the security code in the box. + +After that you can: + +
    +
  • Transfer calls: by dragging the phone icon to the destination you want + +Hangup calls: by double clikcing on the red button + +Originate calls: by dragging an available extension to an available destination + +Conference calls: You can add a third person to an existing conversation by dragging an available extension to a leg of an already connected call. +
+You can also write additional information in the Info box before transferring or originating a call. If text is entered in the Info box, it will be used as the Caller ID text for any originated or transferred calls.e.g. "555-1212 Bob Jones/IBM" + Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/FAQ =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/FAQ (revision 180) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/FAQ (revision 180) @@ -0,0 +1,65 @@ +Flash Operator Panel frequently asked questions: +------------------------------------------------ + +Q0: Do I have to run a webserver? + +A0: Yes, its a Flash applet, it works from a web browser. You can use apache + or any other webserver you like. It was tested with Windows, Linux, and + Mac browsers. Its truly multiplatform! + + +Q1: Do I need to install additional Perl modules to run op_server.pl? + +A1: No, it works without extra modules. + + +Q2: International characters are not displayed in button labels! Is it + possible to use foreign characters? + +A2: Yes, its possible. The flash movie will display international + characters if you encode the text with UTF-8. You can encode the files + from the command line using vi: + + vi -c ":wq! ++enc=utf8" op_buttons.cfg + + There is a downside to this. If you originate calls from the panel, the + caller id will be set with the utf8 label (ilegible characters in the + clid) + +Q3: I do not want to mess with the caller id text and the asterisk database. + Can I disable that feature? + +A3: Sure, just modify op_style.cfg and set the show_clid_info variable to 0 + (zero). + + +Q4: When I try to open the webpage, the browser hangs. Whats wrong? + +A4: The flash movie tries to read a file named 'variables.txt' that is + generated by op_server.pl in the same directory where the .swf file + lives. If this file is corrupted or incomplete, the flash movie might + loop forever. Make sure you have the file in place. If its not there, + you might have permissions problems or you forgot to run op_server.pl. + + +Q5: I changed the style op_style.cfg, but when I reload the page I don't + see the changes. What's up? + +A5: The flash movie requests the file variables.txt when it starts. If your + browser caches that file, you won't see the changes you made unless you + clear your browser cache, or maybe just requesting the variables.txt + file and hitting reload a couple of times. + +Q6: I do not like editing a text file to change a visual layout! + +A6: Me neither, I dream of a visual layout configuration. But I do not have + the time to make it happen. Maybe in the future. + +Q7: Where is the .fla file? + +A7: The server is GPL, the client is not. I do not like the .fla + format. I have ported the client to MING, under ming-source you will + find the perl source for generating a working .swf client. I will give + the .fla source to the first person who donates me a loaded powerbook + with OSX 10.3.5 and Macromedia Tools installed . + Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/CHANGES =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/CHANGES (revision 582) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/CHANGES (revision 582) @@ -0,0 +1,563 @@ +CHANGES to Flash Operator Panel + +.23 + Jul 6 2005: + + - Added Queue Position status. Just change your queue buttons to use + more than one position. Then, instead of having a summary button for + your queue you will have each position destined to the person waiting + in that same position on your queue. You can drag them as any other + button to transfer. + + - Minor bugfixes + + - Internationalization support. 'language' configuration directive + in op_server.cfg and op_lang_XX.cfg files and help_XX.html + + - Support for command line parameters, start the server with --help + to see the list of supported options + + - The web_hostname and port settings in op_server.cfg are now optional + If omited it will connect to the same host where the .swf resides and + port 4445 + + - Added restriction for mybutton to FOP_Popup userevent, just add the + (optional) Button parameter with the button position (that must be + set in the client's mybutton parameter) + + exten => 1,1,UserEvent(FOP_Popup|URL: page.php?e=${EXTEN}^Target: top^Button: 1) + + - Added font and shadow color parameters for button labels and for text + legends. In op_style.cfg you have 2 optional new parameters: + + label_font_color = 000000 + label_shadow_color = FFFFFF + + You have to put the hex color code for each one. To change the color of a legend + use the parameter: + + font_color = FF0000 + + Improved debian init script. Thanks to Tzafir Cohen. + +.22 + Jun 9 2005: + + - Minor bugfixes + +.21 + May 29 2005: + + - You can use 'transparent' as a fade_color for a button in + op_style.cfg. That button will only display its borders, with + no background color. You can use the background.jpg in creative + ways now. + + - The restrict input parameter can be set to a channel name + instead of just the button possition. The restricted button + will be hightlithed. + + - Added margintop and marginleft to the input parameters taken by + operator_panel.swf, to set the global margins for the swf object. + You can experiment by loading the .swf file directly like: + operator_panel.swf?margintop=20&marginleft=40 + + - Added voicemail_extension parameter to op_server.cfg. If set, + FOP will originate a call to that extension when double clicking + on the MWI icon. + + - Added version checking between client & server + + - You can disable the icon for a button by using icon=0 + + - Added support for Zap DND state. You have to define the 'dnd' + family in op_astdb.cfg + + - Added astdb checks. See op_astdb.cfg and extensions.conf.sample + for details. You can check for day/time mode or anything that its + stored on asterisk db. + + - Changed the PARKXXX buttons to PARK/XXX for consistency. The old + syntax will still work fine. + + - Added monitoring for callerid instead of channel name. Use + [CLID/XXXXXX] as the button name in op_buttons.cfg. Its experimental + Commands like originates and others might not work. This kind + of button will work with CVS-HEAD and without using the dial 'o' + flag. + + - Added persistent security code. It remembers your last input so + you don't have to complete it the next time you open FOP. + + - Added Panel_Context=* to op_buttons.cfg files, with it, that entry + will be added to every panel context defined. + + - Fixed callerid on CVS-HEAD, now it works without using + the dial 'o' flag + + - Added agent status. It displays Idle status an its + timers, and refresh queue statistics after each agent + call. Set agent_status to 1 in op_server.cfg + + - Added the option to change the led color from asterisk's + dialplan: + + exten => 1,1,UserEvent(FOP_ledcolor|Color: 0x0000FF^State: 0) + + The color can be any hex value. The State is: + + 0 for available status (channel not in use) + 1 for busy status (channel in use) + 2 for agent status (channel not in use and logged in agent) + + - Added the option to fire screen pops from asterisk's + dialplan: + + exten => 1,1,UserEvent(FOP_Popup|URL: page.php?e=${EXTEN}^Target: top) + + - Removed some DOWN status events that were redundant + + - Added callerid name in screen popups, look at the + mypage.php sample in the html directory + + - Initial Status is fetched from op_server.pl memory + instead of querying asterisk every time. Saves lots + of asterisk resources and speeds things up + + - Fixed infobox bug when a button has multiple matches + + - Background image. Just place a background.jpg file + in the same directory as the .swf file and it will + be displayed as the background. The canvas size is + 996x600 + + - REGEXP buttons. Wildcard buttons are discarded in + favor of the more powerful REGEXP buttons. If you + use wildcard buttons, replace them with a REGEXP + (Ex: if you have [SIP/*] change it to [_SIP/.*]) + + - The security code is now optional (leave it blank + in op_server.cfg for no security code when performing + actions) + + - Added absolute timeout for transferred calls + + - Added the option to restart asterisk instead of reload + the panel when hitting the reload button (enable_restart + in op_server.cfg) + + - Reworked some button matching routines, now it should + support Modem[i4l], oh323/* and mISDN + +.20 + Feb 22 2005: + + - Added support for monitoring multiple asterisk servers + + - Added wildcard buttons (IAX2/*) + + - Added Park Slot buttons (PARK701) + + - Barge Muted (barge_muted in op_server.cfg) + Will start the 3rd leg muted when barging in + + - CallerID Privacy (clid_privacy in op_server.cfg) + Will hide the callerid number in the buttons + + - Show IP address of peers (show_ip in op_server.cfg) + Will show the ip address of peers in their buttons + + - Text legends (LEGEND primitive in op_buttons.cfg) + + - Highlight of linked buttons + + - Added Mailbox parameter to the button definition + + - You can specify a channel name in the dial parameter + when using click-to-dial features, thus making it easier + to implement + +.19 + Nov 04 2004: + + - Improved call details, now there is a queue/agent information + window and last call details window. + + - Bugfixes and visual layout tweaks. You can set the highlight color, etc. + + - You can define a distinct style per panel context. See op_style.cfg + + - You can include files in op_buttons.cfg with the keyword 'include =>' + + - The swf client is compressed and much smaller. + + - When op_server.pl recconects, it close flash clients connections to + force a reconnect and update on their status. + +.18 + Oct 29 2004: + + - Ming client is now the default, the new features work with + that client only. + + - Led color configurable via op_style.cfg + + - More label renaming options + (rename to agent name, rename queuememebers, etc) + + - Option to change led color for logged in agents + + - New click to dial feature, accesible via javascript + (examples in the html subdir) + + - Ability to draw rectangles (see op_buttons.cfg for examples) + + - Added polling for IAX presence + +.17 + Oct 21 2004: + + - Mostly a bug fix release. Fixed the reload button in the ming client. + + - Added polling of agents status on connect + + - Initial take on showing detail info on each agent + +.16 + Oct 20 2004: + + - Bug fixes: parked channel feature works again, ringing state too. + + - Encryption is now optional, you can enable or disable it by changing + enable_crypto in op_style.cfg (while is this parameter in op_style + you may ask? well, the client has the ability to request encryption or + not, op_style.cfg sets not only visual parameters, but any client + parameter. I might change the configuration file name to op_client.cfg + in the future. Without encryption the client uses less CPU. + + - Include the option for polling voicemail status together with sip + peers (poll_voicemail in op_server.cfg) + + - New feature: ability to rename button labels when agents log in ( + rename_label_agentlogin and rename_label_callbacklogin inside + op_server.cfg) + + - New Ming client included. Ming is a library for generating .swf files + with wrappers in several languages. I used the perl wrapper to produce + a complete client. The source is included in the ming-source directory + The precompiled .swf file is in the html directory together with the + native flash client. Further development might be done exclusively in + Ming. + + - The Ming client treats fonts a little diferent. If you enable + use_embed_fonts in op_style.cfg, then all the font_family values will + be overriden by the only embedded font in the .swf. The + embedded font looks uniform compared to system (or browser) fonts. You + *can* use any font_family available in your platform: just disable the + use of embed fonts and select the family for each legend in a button.. + but you might end up with chopped text depending of the type of font + you use. + + +.15 + Oct 1st 2004: + + - New configuration file format, there is an utility to convert + your old configuration to the new format. See UPGRADE, and don't + forget to backup first. Be sure to run the utility only with + old configuration files, use it once and then remove it just in + case. + + - Fixed MessageWaiting when channel was in another context + + - MD5 Authentication to Asterisk Manager (md5_auth in op_server.cfg) + + - Improved context handling in general. Now you can have a security + code for each context, as well as meetme rooms to use for bargein. + + - There is no more auto_conf_exten for finding an empty meetme for + barge-ins. You now have to specify the rooms available for that + feature with the parameter barge_rooms in op_server.cfg + + - Timers are now polled from Asterisk on initial connect. (If you open + the panel when a conversation was going, you will see the real duration + of the call) + + - TEA Encryption for messages sent from server to client. MD5 used for + hashing the password. + + - Many cosmetical changes to the flash movie, as well as optimizations + and rewrites. There are new icons, animations, etc. + + - More information available when a call is disconnected, including + queue status information (completed calls, average holdtime, etc) + To get the info double click on the arrow when a call is finished. + + - Added ability to mute/unmute meetme participants by clicking on the + arrow. + + - Supports for register/unregister/unreachable/lagged realtime events + for SIP and IAX peers + + - You can restrict the drag and drop commands to one button only, see + index-restrict.html in the html subdirectory + +.14 + Jul 28th 2004: + + - You can run the op_server.pl dettached from the console by starting it + with the parameter '-d'. There are sample init scripts in the init + directory for redhat and debian. + + - You can now drag a parked channel and transfer it to an available + extension just like any other transfer. + + - Changed to work well with Asterisk RC1 (IAX2 channel names have changed + from "IAX2[ext@context]" to IAX2/ext@context. Your IAX2 channels in + op_buttons.cfg must be renamed if you use RC1. If you do not user RC1, + it might work as before, but I have not tested it. + + - The flash side has a lot of improvements and changes. The fonts _sans + and _serif are now embedded, so they will look consistent in different + client computers (the tradeoff is a bigger swf file). When a channel is + offline, the label text will also be grayed out. When dragging an icon, + there is now visual feedback for the destination button. Added transparent + mask to the icons to make drag easier. If the client looses connection to + the op_server.pl, it will try to reconnect by itself (it does not work + on linux, its a flash bug). + + - Also in the flash side, there are new elements. A little arrow showing + the direction of the call. And if you double click that little arrow + after a call is made, you can see the last call status. The new parameters + for op_style.cfg are described in UPGRADE + + - There is a new parameter in op_server.cfg: clid_format + You can choose the format for the caller id to be presented in the client + The letter 'x' will be replaced with a number, any other text will be + preserved. + +.13 + Jul 12th 2004: + + - Fixed an annoying bug that prevented the initial status to be displayed + (the context for wich the panel request events was sent after the + status events, so they were ignored by the flash client) + + - Fixed another annoying bug, the clid text was of an incorrect height, + and the drag and drop was erratic because of this + + - Improved the parking display on the channels. Now you have a flashing + led and a text in the button itself + + - Added a timer with the duration of a call to each button + + - Still more bugs to clean on the trunk feature, please report feedback + on the mailing list.. + +.12 + Jul 5th 2004: + + - Added a caller id display on the button itself + + - The status of meetme and queues is queried on initial connect + + - The event handling was rewriten. Now the flash client receives the + events for its own context (in previous versions, the events were + broadcasted to all clients) + + - Cleaned the debug output a bit. + + - You can send a USR1 signal to the server and look at some state + variables. + + +.11 + Jun 29th 2004: + + - Added 'trunk' buttons. You can define many buttons for just one user. + It is not well tested, as I do not have the means to test it. It might + introduce bugs! + + - Added CRM software integration. You can monitor a button, and when it + rings, a web page is requested in the url and target you specify, with + the clid sent as a GET variable. + + - The debug option in op_server.cfg has changed. See the UPGRADE file or + the online documentation, or the comments on op_server.cfg + +.10 + Jun 22th 2004: + + - Added Contexts for the panel. You can have one server and several + different panels. + + - Added 'Parked calls' as a status for a defined channel/button + + - Fixed important bugs (MWI with contexts not working, transfers not + working in particular situations) + + - Totally new webpage, for up to date documentation, go there + + - You can send a HUP signal to op_server.pl and it will rewrite the + configuration files for the flash applet. + + - New RELOAD button in flash, it will reread the server configuration + and refresh the display. + +.09 + Jun 8th 2004: + + - Added Message Waiting count. When passing the mouse over the envelope + icon the status shows the New and Old messages in that mailbox + + - The server sets the CallerID when originating a call. + + - Changed the debug parameter in op_server.cfg to a bitmap for greater + control off debug output. + + - Changed the way it handles extension numbers (column number 4) in + op_buttons.cfg. Now you can specify the context where the extension + resides by using the syntax: + + extension@context + + If the extension is not reachable from the default context, you must + specify its context there. + + - Changed the way it handles IAX2 channels. To specify an IAX channel you + have to specify its name only, without '@context', eg: + + IAX2[john] + + +.08 + Jun 2nd 2004: + + - Added "Extra Info" Input box + + You can write any text you want in that box. When transferring or + originating a call, that text will be used as the callerid text for + that call. This way you can pass usefull information to the person + you are transferring the call. In order for this feature to work you + need to modify your dialplan ("extensions.conf"). There is an example + extensions.conf provided. + + - Configurable layout of the toolbar + + The bar at the top of the flash applet is now configurable. There are + new parameters in op_style.cfg to adjust the layout: + + clid_label=Extra Info: + security_label=Security Code: + btn_help_label=Help + btn_log_label=Debug + show_security_code=1 + show_clid_info=2 + show_status=3 + show_btn_help=4 + show_btn_debug=5 + + The numbers in the show_xxx varialbes indicates the position in the + toolbar. If you do not want to display an element, set it to 0. + + - Added HELP button and text to the flash movie + + You can add a help.txt file in the same directory as the flash movie + on your webserver. This file will be displayed inside the help window + of the flash movie. You can use basic html tags. You *must* start the + file with the words "text=" + +.07 + May 19th 2004: + + - Added conference buttons + + The channel column (first one) in op_buttons.cfg must be named with + the number of the meetme conference. Eg: you have a meetme conference + number 901, the name of the channel must be '901'. Look at the example + config. + + - Added tranfer of an empty channel to an already connected call and + automatically conference the three parties together + + You have two new parameters in op_server.cfg: + + auto_conference_extension + conference_context + + Set them up and look at op_server.cfg for an example configuration for + asterisk in extensions.conf and meetme.conf + + - Added origination of calls + + You can drag an available button to another available button. This + will originate a call from the first channel to the extension defined + in the desintation button. + + - More readable output log for op_server.pl + +.06 + May 12th 2004 + + - Added voicemail notification: + + There is a new parameter in op_buttons.cfg. The last column has the + voicemail context of the extension. You can leave it blank and it will + not check/show the voicemail status for that button (if its a queue + button or an extension without voicemail on). + + You also have three new parameters in op_style.cfg: + + mail_margin_left + mail_margin_top + mail_scale + + to set the placement and size of the voicemail icon in the button. + +.05 + Apr 17th 2004 + + - Fixed a typo that prevented the applet from working. + +.04 + Apr 16th 2004 + + - Changed configuration files + + The configuration files are different: in version .03 the + op_server.cfg had the button configuration and layout. In version + .04 that information is stored in op_buttons.cfg. There are 2 new + parameters in op_buttons.cfg, extension and icon. + + op_server.cfg is now used for the parameters of the op_server + itself, like port to listent to, security code, debug level. You + don't have to modify op_server.pl anymore. All configuration is done + in the cfg files. + + There is a new configuration file: op_style.cfg with the style and + size of the buttons. + + - Added Queues buttons + + You can display call queues on a button. Just put the name + of the queue as the channel name. + + - Reconnection to Asterisk Manager port + + The op_server now tries to reconnect to Asterisk Manager + port in case of disconnection. So if you restart Asterisk + you don't need to restart the op_server.pl, it will reconnect + by itself. + + - Totally redone flash movie: operator_panel3.swf + + The flash applet in version .04 is totally rewriten. IÏt + has no bitmaps. All graphics are vector based, so you can + change the style and sizes without loosing detail. There + is no timer or status on each button in order to save space. + You can see the status of a channel by passing the mouse + over the red oval. + + The new op_server.pl is compatible with the flash applet + of previous versions (operator_panel.swf), with fixed 24 + buttons display, timers, and scrolling info on each channel. Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_it.cfg =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_it.cfg (revision 583) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_lang_it.cfg (revision 583) @@ -0,0 +1,31 @@ +; Archivio di localizzazione nazionale +dialing=Componendo +calling=Chiamando $1 +incoming=Chiamata in arrivo da $1 +parked=Parcheggiata su $1 +registered=Registrato +notregistered=Non registrato +reachable=Raggiungibile $1 +unreachable=Non raggiungibile $1 +lagged=Trattenuto $1 +newold=Attuale $1, Precedente $2 +waitingonqueue=$1 utente$2 in attesa +memberonconference=$1 partecipanti$2 +version_mismatch=Versione disallineata tra Client e Server! +; client side +clid_label=Info +detail_title=Dettagli ultima chiamata +detail_from=Da: +detail_to=A: +detail_duration=Durata: +security_code_title=Introdurre il codice di sicurezza +btn_security_text=Attiva richiesta Codice di sicurezza +btn_restart_text=Riavvia Asterisk +btn_reload_text=Ricarica la configurazione +btn_debug_text=Apre/Chiude la finestra di debug +btn_help_text=Attiva l'aiuto online +tab_call_text=Chiama +tab_queue_text=Coda +calls_taken_text=Chiamate trattenute +no_data_text=Non ci sono dati disponibili +debug_window_title=Finestra di debug Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/help_en.html =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/help_en.html (revision 2615) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/help_en.html (revision 2615) @@ -0,0 +1,14 @@ +

Before performing actions, you need to enter the security code in the box.
+
+After that you can: +

    +
  • Transfer calls: by dragging the phone icon to the destination you want
  • +
  • Hangup calls: by double clikcing on the red button
  • +
  • Originate calls: by dragging an available extension to an available destination
  • +
  • Conference calls: You can add a third person to an existing conversation by dragging an available extension to a leg of an already connected call.
  • +
+You can also write additional information in the Info box before transferring +or originating a call. If text is entered in the Info box, it will be used as +the Caller ID text for any originated or transferred calls.e.g. "555-1212 +Bob Jones/IBM" +

Index: /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_server.pl =================================================================== --- /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_server.pl (revision 5779) +++ /freepbx/branches/ari_changes/amp_conf/htdocs_panel/op_server.pl (revision 5779) @@ -0,0 +1,10820 @@ +#!/usr/bin/perl + +# Flash Operator Panel. http://www.asternic.org +# +# Copyright (c) 2004 Nicolás Gudiño. All rights reserved. +# +# Nicolás Gudiño +# +# This program is free software, distributed under the terms of +# the GNU General Public License. +# +# THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use strict; +use warnings; +use integer; + +use constant DEBUG => 0; +use constant BYTES_TO_READ => 256; + +use IO::Socket; +use IO::Select; +use Getopt::Long; +use Pod::Usage; +use Fcntl; +use POSIX qw(setsid EWOULDBLOCK); + +my $FOP_VERSION = "SVNVERSION"; +my %datos = (); +my %chanvar = (); +my %monitoring = (); +my %passvar = (); +my %sesbot = (); +my %linkbot = (); +my %cache_hit = (); +my %estadoboton = (); +my %preestadoboton = (); + +my %boton_paused = (); +my %boton_agentready = (); +my %boton_agentpaused = (); +my %boton_agentbusy = (); +my %boton_agentlogedof = (); +my %botonled = (); +my %botonalpha = (); +my %botonledcolor = (); +my %botonregistrado = (); +my %boton_ip = (); +my %botonlabel = (); +my %botonlabelonly = (); +my %botonsetlabel = (); +my %botontimer = (); +my %botontimertype = (); +my %botonpark = (); +my %botonmeetme = (); +my %botonclid = (); +my %botonpermanenttext = (); +my %botonqueue = (); +my %botonqueue_count = (); +my %botonqueuemember = (); +my %botonvoicemail = (); +my %botonvoicemailcount = (); +my %botonlinked = (); +my %parked = (); +my %meetme_pos = (); +my %laststatus = (); +my %autenticado = (); +my %auto_conference = (); +my %attendant_transfer = (); +my %attendant_pending = (); +my %pending_uniqueid_attendant = (); +my %mute_other = (); +my %autosip = (); +my %cnt_auto_pos = (); +my $cnt_autosip = 0; +my %autosip_detail = (); +my %buttons = (); +my %buttons_queue = (); +my %buttons_queue_reverse = (); +my %buttons_preserve_case = (); +my %buttons_astdbkey = (); +my %button_server = (); +my %buttons_reverse = (); +my %textos = (); +my %iconos = (); +my %urls = (); +my %alarms = (); +my %targets = (); +my %remote_callerid = (); +my %remote_callerid_name = (); +my %extension_transfer = (); +my %extension_transfer_reverse = (); +my %max_queue_waiting_time_for = (); +my %flash_contexto = (); +my %saved_clidnum = (); +my %saved_clidname = (); +my %keys_socket = (); +my %manager_socket = (); +my %start_muted = (); +my %timeouts = (); +my %no_rectangle = (); +my %background = (); +my %astdbcommands = (); +my %client_queue = (); +my %manager_queue = (); +my %client_queue_nocrypt = (); +my %ip_addy = (); +my %agents_available_on_queue = (); +my $queue_object = {}; +my %is_agent = (); +my %agents_on_queue = (); +my %max_lastcall = (); +my $config = {}; +my $cola = {}; +my $language = {}; +my $global_verbose = 1; +my $help = 0; +my $version = 0; +my $counter_servers = -1; +my %bloque_completo; +my %buferbloque; +my $bloque_final; +my $todo; +my $reload_pending = 0; +my $regexp_buttons = 0; +my $auto_buttons = 0; +my @auto_config = (); +my $queueagent_buttons = 0; +my $defaultlanguage; +my @bloque; +my @respuestas; +my @all_flash_files; +my @masrespuestas; +my @fake_bloque; +my @flash_clients; +my @status_active; +my @panel_contexts; +my %mailbox; +my %tovoicemail; +my %tospy; +my %instancias; +my %agent_to_channel; +my %agent_label; +my %togle_action; +my %togle_response; +my %channel_to_agent; +my %reverse_agents; +my %agents_name; +my @p; +my $m; +my $O; +my @S; +my @key; +my @manager_host = (); +my @manager_port = (); +my @manager_user = (); +my @manager_secret = (); +my @event_mask = (); +my @astmanproxy_servers = (); +my @manager_conectado = (); +my %manager_desconectado; +my %mask_hash; +my $web_hostname; +my $listen_port; +my $park_exten; +my $parktimeout; +my $listen_addr; +my $security_code; +my $flash_dir; +my $astmanproxy_server = ""; +my $restrict_channel = ""; +my $socketpolicy; +my $poll_interval; +my $poll_voicemail; +my $kill_zombies; +my $ren_agentlogin; +my $ren_cbacklogin; +my $ren_agentname; +my $agent_status; +my $ren_queuemember; +my $ren_wildcard; +my $clid_privacy; +my %clid_private; +my %group_count; +my $show_ip; +my $queue_hide; +my $enable_restart; +my $passvars = ""; +my $change_led; +my $cdial_nosecure; +my $barge_muted; +my $debuglevel = -1; +my $debuglevel_cache = ""; +my $cont_debug_cache = 0; +my $flash_file; +my %barge_rooms; +my %barge_context; +my $first_room; +my $last_room; +my $clid_format; +my $directorio = ""; +my $auth_md5 = 1; +my $astmanproxy_host = ""; +my $astmanproxy_port = "5038"; +my $md5challenge; +my $reverse_transfer; +my %shapes; +my %legends; +my %images; +my %no_encryption = (); +my %total_shapes; +my %total_legends; +my %total_images; +my @serverinclude = (); +my @btninclude = (); +my @styleinclude = (); +my $command = ""; +my $daemonized = 0; +my $pidfile = "/var/run/op_panel.pid"; +my $logdir = ""; +my $confdir = ""; +my $tab = ""; + +my $PADDING = join( + '', + map( chr, + ( + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ) ) +); +my %a2b = ( + A => 000, + B => 001, + C => 002, + D => 003, + E => 004, + F => 005, + G => 006, + H => 007, + I => 010, + J => 011, + K => 012, + L => 013, + M => 014, + N => 015, + O => 016, + P => 017, + Q => 020, + R => 021, + S => 022, + T => 023, + U => 024, + V => 025, + W => 026, + X => 027, + Y => 030, + Z => 031, + a => 032, + b => 033, + c => 034, + d => 035, + e => 036, + f => 037, + g => 040, + h => 041, + i => 042, + j => 043, + k => 044, + l => 045, + m => 046, + n => 047, + o => 050, + p => 051, + q => 052, + r => 053, + s => 054, + t => 055, + u => 056, + v => 057, + w => 060, + x => 061, + y => 062, + z => 063, + '0' => 064, + '1' => 065, + '2' => 066, + '3' => 067, + '4' => 070, + '5' => 071, + '6' => 072, + '7' => 073, + '8' => 074, + '9' => 075, + '+' => 076, + '_' => 077, +); +my %b2a = reverse %a2b; +my $rand_byte_already_called = 0; + +$SIG{PIPE} = 'IGNORE'; +$SIG{ALRM} = 'alarma_al_minuto'; +$SIG{INT} = 'close_all'; +$SIG{HUP} = 'generate_configs_onhup'; +$SIG{USR1} = 'dump_internal_hashes_to_stdout'; + +GetOptions( + 'p|pidfile=s' => \$pidfile, + 'l|logdir=s' => \$logdir, + 'c|confdir=s' => \$confdir, + 'd|daemon' => \$daemonized, + 'V|version' => \$version, + 'x|debuglevel=i' => \$debuglevel, + 'help|?' => \$help +); + +pod2usage(1) if $help; + +if ( $version == 1 ) { + print "op_server.pl version $FOP_VERSION\n"; + exit 0; +} + +if ( $confdir eq "" ) { + + # if there is no config directory supplied at the command line + # use the same directory where op_server.pl lives + $directorio = $0; + $directorio =~ s/(.*)\/(.*)/$1/g; +} +else { + $directorio = $confdir; +} + +if ( $logdir ne "" ) { + open( STDOUT, ">>$logdir/output.log" ) + or die "Can't open output log $logdir/error.log"; + open( STDERR, ">>$logdir/error.log" ) + or die "Can't open output log $logdir/error.log"; +} + +if ( $daemonized == 1 ) { + defined( my $pid = fork ) or die "Can't Fork: $!"; + exit if $pid; + setsid or die "Can't start a new session: $!"; + open MYPIDFILE, ">$pidfile" + or die "Failed to open PID file $pidfile for writing."; + print MYPIDFILE $$; + close MYPIDFILE; + + close(STDIN); + if ( $logdir eq "" ) { + close STDOUT; + close STDERR; + } +} + +sub read_language_config() { + $/ = "\n"; + + # tries to read and parse every language file needed + foreach my $ctx (@panel_contexts) { + if ( !defined( $config->{$ctx}{language} ) ) { + $config->{"$ctx"}{language} = $defaultlanguage; + } + + my $lang = $config->{$ctx}{language}; + $lang =~ tr/A-Z/a-z/; + $lang =~ s/\W//g; + $config->{$ctx}{language} = $lang; + + open( CONFIG, "<$directorio/op_lang_$lang.cfg" ) + or die("Could not open $directorio/op_lang_$lang.cfg. Aborting..."); + + while () { + chop; + $_ =~ s/^\s+//g; + $_ =~ s/([^;]*)[;](.*)/$1/g; + $_ =~ s/\s+$//g; + next unless $_ ne ""; + my ( $variable_name, $value ) = split( /=/, $_ ); + $variable_name =~ tr/A-Z/a-z/; + $variable_name =~ s/\s+//g; + $value =~ s/^\s+//g; + $value =~ s/\s+$//g; + $value =~ s/\"//g; + $language->{$ctx}{$variable_name} = $value; + } + close(CONFIG); + } + $/ = "\0"; +} + +sub parse_amportal_config { + my $filename = shift; + my %ampconf; + + open( AMPCONF, $filename ) || die "Cannot open $filename"; + + while () { + if ( $_ =~ /^\s*([a-zA-Z0-9]+)\s*=\s*(.*)\s*([;#].*)?/ ) { + $ampconf{$1} = $2; + } + } + + close(AMPCONF); + return %ampconf; +} + +sub read_server_config() { + my $context = ""; + my @distinct_files; + $counter_servers = -1; + + $/ = "\n"; + + @distinct_files = unique(@serverinclude); + + foreach my $archivo (@distinct_files) { + + open( CONFIG, "<$directorio/$archivo" ) + or die("Could not open op_server.cfg. Aborting..."); + + while () { + chomp; + $_ =~ s/^\s+//g; + $_ =~ s/([^;]*)[;](.*)/$1/g; + $_ =~ s/\s+$//g; + + if ( /^#/ || /^;/ || /^$/ ) { + next; + } # Ignores comments and empty lines + + if (/^\Q[\E/) { + s/\[(.*)\]/$1/g; + tr/a-z/A-Z/; + $context = $_; + } + else { + if ( $context ne "" ) { + my ( $variable_name, $value ) = split( /=/, $_ ); + $variable_name =~ tr/A-Z/a-z/; + $variable_name =~ s/\s+//g; + $value =~ s/^\s+//g; + $value =~ s/\s+$//g; + $value =~ s/\"//g; + $config->{$context}{$variable_name} = $value; + + if ( $variable_name eq "manager_host" ) { + $counter_servers++; + $manager_host[$counter_servers] = $value; + } + + if ( $variable_name eq "manager_user" ) { + $manager_user[$counter_servers] = $value; + } + + if ( $variable_name eq "manager_secret" ) { + $manager_secret[$counter_servers] = $value; + } + + if ( $variable_name eq "manager_port" ) { + $manager_port[$counter_servers] = $value; + } + + if ( $variable_name eq "event_mask" ) { + $event_mask[$counter_servers] = $value; + } + + if ( $variable_name eq "astmanproxy_server" ) { + push @astmanproxy_servers, $value; + } + + } + } + } + close(CONFIG); + } + + if ( defined( $config->{GENERAL}{use_amportal_conf} ) ) { + if ( $config->{GENERAL}{use_amportal_conf} == 1 ) { + my $freepbx_config = "/etc/amportal.conf"; + my %ampconf; + + if ( -e $freepbx_config ) { + %ampconf = parse_amportal_config($freepbx_config); + $config->{"GENERAL"}{"web_hostname"} = $ampconf{"AMPWEBADDRESS"}; + $config->{"GENERAL"}{"security_code"} = $ampconf{"FOPPASSWORD"}; + $config->{"GENERAL"}{"flash_dir"} = $ampconf{"FOPWEBROOT"}; + $manager_user[0] = $ampconf{"AMPMGRUSER"}; + $manager_secret[0] = $ampconf{"AMPMGRPASS"}; + } + } + } + + $web_hostname = $config->{GENERAL}{web_hostname}; + $listen_port = $config->{GENERAL}{listen_port}; + $listen_addr = $config->{GENERAL}{listen_addr}; + $security_code = $config->{GENERAL}{security_code}; + $flash_dir = $config->{GENERAL}{flash_dir}; + $poll_interval = $config->{GENERAL}{poll_interval}; + $poll_voicemail = $config->{GENERAL}{poll_voicemail}; + $kill_zombies = $config->{GENERAL}{kill_zombies}; + $reverse_transfer = $config->{GENERAL}{reverse_transfer}; + $auth_md5 = $config->{GENERAL}{auth_md5}; + $astmanproxy_host = $config->{GENERAL}{astmanproxy_host}; + $astmanproxy_port = $config->{GENERAL}{astmanproxy_port}; + $ren_agentlogin = $config->{GENERAL}{rename_label_agentlogin}; + $ren_cbacklogin = $config->{GENERAL}{rename_label_callbacklogin}; + $ren_wildcard = $config->{GENERAL}{rename_label_wildcard}; + $ren_agentname = $config->{GENERAL}{rename_to_agent_name}; + $agent_status = $config->{GENERAL}{agent_status}; + $ren_queuemember = $config->{GENERAL}{rename_queue_member}; + $change_led = $config->{GENERAL}{change_led_agent}; + $cdial_nosecure = $config->{GENERAL}{clicktodial_insecure}; + $barge_muted = $config->{GENERAL}{barge_muted}; + $clid_privacy = $config->{GENERAL}{clid_privacy}; + $show_ip = $config->{GENERAL}{show_ip}; + $queue_hide = $config->{GENERAL}{queue_hide}; + $enable_restart = $config->{GENERAL}{enable_restart}; + $defaultlanguage = $config->{GENERAL}{language}; + $passvars = $config->{GENERAL}{passvars}; + $park_exten = $config->{GENERAL}{parkexten}; + $parktimeout = $config->{GENERAL}{parktimeout}; + + if ( $debuglevel == -1 ) { + $debuglevel = $config->{GENERAL}{debug}; + } + + my @todos_los_rooms; + foreach my $val ($config) { + while ( my ( $aa, $bb ) = each( %{$val} ) ) { + while ( my ( $cc, $dd ) = each( %{$bb} ) ) { + if ( $cc eq "barge_rooms" ) { + ( $first_room, $last_room ) = split( /-/, $dd ); + if ( !defined($last_room) ) { + $last_room = $first_room; + } + my @arrayroom = $first_room .. $last_room; + foreach (@arrayroom) { + $barge_context{"$_"} = $aa; + } + push( @todos_los_rooms, @arrayroom ); + } + } + } + } + %barge_rooms = map { $todos_los_rooms[$_], 0 } 0 .. $#todos_los_rooms; + + $clid_format = $config->{GENERAL}{clid_format}; + if ( !defined($flash_dir) ) { $flash_dir = '/var/www/html' } + $flash_file = $flash_dir . "/variables.txt"; + push @all_flash_files, $flash_file; + + if ( !defined $web_hostname ) { + $web_hostname = ""; + } + if ( !defined $listen_port ) { + $listen_port = 4445; + } + if ( !defined $listen_addr ) { + $listen_addr = "0.0.0.0"; + } + if ( !defined $astmanproxy_host ) { + $astmanproxy_host = ""; + } + else { + @manager_host = (); + @manager_user = (); + @manager_secret = (); + push @manager_host, $astmanproxy_host; + push @manager_user, "astmanproxy"; + push @manager_secret, "astmanproxy"; + } + + if ( defined $astmanproxy_port ) { + @manager_port = (); + push @manager_port, $astmanproxy_port; + } + + if ( !defined $security_code ) { + die("Missing security_code in op_server.cfg!"); + } + + if ( !defined $flash_dir ) { die("Missing flash_dir in op_server.cfg!"); } + + if ( !defined $poll_interval ) { + die("Missing poll_interval in op_server.cfg!"); + } + + if ( !defined $ren_agentlogin ) { + $ren_agentlogin = 0; + } + + if ( !defined $defaultlanguage ) { + $defaultlanguage = "en"; + $config->{DEFAULT}{language} = "en"; + } + + if ( !defined $config->{GENERAL}{monitor_filename} ) { + $config->{GENERAL}{monitor_filename} = "\${UNIQUEID}"; + } + + if ( !defined $config->{GENERAL}{monitor_format} ) { + $config->{GENERAL}{monitor_format} = "wav"; + } + + if ( !defined $clid_privacy ) { + $clid_privacy = 0; + } + + if ( !defined $show_ip ) { + $show_ip = 0; + } + + if ( !defined $queue_hide ) { + $queue_hide = 0; + } + + if ( !defined $ren_wildcard || $ren_wildcard eq "" ) { + $ren_wildcard = 1; + } + + if ( !defined $reverse_transfer || $reverse_transfer eq "" ) { + $reverse_transfer = 0; + } + + if ( !defined $barge_muted || $barge_muted eq "" ) { + $barge_muted = 0; + } + + if ( !defined $enable_restart || $enable_restart eq "" ) { + $enable_restart = 0; + } + + if ( !defined $cdial_nosecure || $cdial_nosecure eq "" ) { + $cdial_nosecure = 0; + } + + if ( !defined $agent_status || $agent_status eq "" ) { + $agent_status = 0; + } + + if ( !defined $ren_agentname || $ren_agentname eq "" ) { + $ren_agentname = 0; + } + + if ( !defined $ren_cbacklogin || $ren_cbacklogin eq "" ) { + $ren_cbacklogin = 0; + } + + if ( !defined $ren_queuemember || $ren_queuemember eq "" ) { + $ren_queuemember = 0; + } + + if ( !defined $change_led || $change_led eq "" ) { + $change_led = 0; + } + + if ( !defined $kill_zombies || $kill_zombies eq "" ) { + $kill_zombies = 0; + } + + if ( !defined $poll_voicemail || $poll_voicemail eq "" ) { + $poll_voicemail = 0; + } + + if ( !defined $clid_format ) { + $clid_format = "(xxx) xxx-xxxx"; + } + + if ( !defined $passvars ) { + $passvars = ""; + } + + if ( !defined $park_exten ) { + $park_exten = "700"; + } + + if ( !defined $parktimeout ) { + $parktimeout = 45000; + } + else { + $parktimeout = $parktimeout * 1000; + } + + if ( !defined $debuglevel ) { + $debuglevel = 0; + } + else { + if ( $daemonized == 1 && $logdir eq "" ) { + $debuglevel = 0; + } + } + $/ = "\0"; +} + +sub collect_includes { + my $filename = shift; + my $tipo = shift; + my $archivo = $directorio . "/" . $filename; + + if ( !-r $archivo ) { + log_debug( "** $archivo not readable... skipping", 16 ) if DEBUG; + return; + } + + if ( $tipo eq "buttons" ) { + if ( !grep { $filename eq $_ } @btninclude ) { + push( @btninclude, $filename ); + } + else { + log_debug( "** $filename already included", 16 ) if DEBUG; + return; + } + } + if ( $tipo eq "style" ) { + if ( !grep { $filename eq $_ } @styleinclude ) { + push( @styleinclude, $filename ); + } + else { + log_debug( "** $filename already included", 16 ) if DEBUG; + return; + } + } + if ( $tipo eq "server" ) { + if ( !grep { $filename eq $_ } @serverinclude ) { + push( @serverinclude, $filename ); + } + else { + log_debug( "** $filename already included", 16 ) if DEBUG; + return; + } + } + + open( CONFIG, "< $archivo" ) + or die("Could not open $filename. Aborting...\n\n"); + + my @lineas = ; + my $cuantos = @lineas; + foreach my $linea (@lineas) { + $linea =~ s/^\s+//g; + $linea =~ s/([^;]*)[;](.*)/$1/g; + $linea =~ s/\s+$//g; + if ( $linea =~ /^include/ ) { + + # store include lines in an array so we can + # process them later excluding duplicates + $linea =~ s/^include//g; + $linea =~ s/^\s+//g; + $linea =~ s/^=>//g; + $linea =~ s/^\s+//g; + $linea =~ s/\s+$//g; + collect_includes( $linea, $tipo ); + } + } + close CONFIG; +} + +sub read_astdb_config() { + $/ = "\n"; + if ( -e "$directorio/op_astdb.cfg" ) { + open( ASTDB, "<$directorio/op_astdb.cfg" ) + or die("Could not open op_astdb.cfg. Aborting..."); + my $contador = 0; + my $key = ""; + while () { + chomp; + $_ =~ s/^\s+//g; + $_ =~ s/([^;]*)[;](.*)/$1/g; + $_ =~ s/\s+$//g; + + if ( /^#/ || /^;/ || /^$/ ) { + next; + } # Ignores comments and empty lines + + if (/^\Q[\E/) { + s/\[(.*)\]/$1/g; + $key = $_; + } + else { + push @{ $astdbcommands{$key} }, $_; + } + } + } + close(ASTDB); + + $/ = "\0"; +} + +sub read_buttons_config() { + my @btn_cfg = (); + my $contador = -1; + my @distinct_files; + my $no_counter = 0; + my @contextos = (); + my %lastposition = (); + + $/ = "\n"; + + @distinct_files = unique(@btninclude); + + foreach my $archivo (@distinct_files) { + open( CONFIG, "< $directorio/$archivo" ) + or die("Could not open $directorio/$archivo. Aborting..."); + + # Read op_buttons.cfg loading it into a hash for easier processing + + while () { + chomp; + $_ =~ s/^\s+//g; + $_ =~ s/([^;]*)[;](.*)/$1/g; + $_ =~ s/\s+$//g; + if ( /^#/ || /^;/ || /^$/ ) { + next; + } # Ignores comments and empty lines + + if (/^\Q[\E/) { + $contador++; + s/\[(.*)\]/$1/g; + my $channel = $_; + $btn_cfg[$contador]{'channel_preserve_case'} = $channel; + $btn_cfg[$contador]{'channel'} = $channel; + + } + else { + next unless ( $contador >= 0 ); + my ( $key, $val ) = split( /=/, $_, 2 ); + if ( !defined($val) ) { $val = ""; } + $key =~ tr/A-Z/a-z/; + $key =~ s/^\s+//g; + $key =~ s/(.*)\s+/$1/g; + if ( $key ne "label" + && $key ne "font_family" + && $key ne "text" + && $key ne "mailbox" + && $key ne "voicemail_context" ) + { + $val =~ s/^\s+//g; + $val =~ s/(.*)\s+/$1/g; + } + $btn_cfg[$contador]{$key} = $val; + if ( $key eq "panel_context" ) { + push @contextos, $val; + } + } + } + + close(CONFIG); + } + + # Read now the auto_sip button config files + foreach my $papi ( sort keys %autosip ) { + if ( !defined( $autosip{$papi}{channel} ) ) { next; } + + $contador++; + log_debug( "-----", 16 ) if DEBUG; + $btn_cfg[$contador]{'channel_preserve_case'} = $autosip{$papi}{channel}; + $btn_cfg[$contador]{'channel'} = $autosip{$papi}{channel}; + if ( defined( $cnt_auto_pos{ $autosip{$papi}{autonumber} } ) ) { + $cnt_auto_pos{ $autosip{$papi}{autonumber} }++; + } + else { + $cnt_auto_pos{ $autosip{$papi}{autonumber} } = 0; + } + + my $pos = $autosip{$papi}{starting_position} + $cnt_auto_pos{ $autosip{$papi}{autonumber} }; + $btn_cfg[$contador]{'position'} = $pos; + $btn_cfg[$contador]{'channel'} = $autosip{$papi}{channel}; + my $logblock = "\n[" . $autosip{$papi}{channel} . "]\n"; + log_debug( $autosip{$papi}{channel} . " at position $pos", 16 ) if DEBUG; + + while ( my ( $key, $val ) = each( %{ $autosip{$papi} } ) ) { + if ( $val eq "" ) { + log_debug( "** Empty value for autosip for key $key, button $papi", 1 ) if DEBUG; + next; + } + $btn_cfg[$contador]{$key} = $val; + $logblock .= "$key=$val\n"; + if ( $key eq "panel_context" ) { + push @contextos, $val; + } + } + log_debug( "$logblock", 1 ) if DEBUG; + } + + my @uniq2 = unique(@contextos); + @contextos = @uniq2; + @uniq2 = grep { !/\*/ } @contextos; + @contextos = @uniq2; + push @contextos, "DEFAULT"; + push @contextos, "GENERAL"; + + # Convert every element to uppercase + @panel_contexts = map { uc } @contextos; + + # Pass to replicate panel_context=* configuration + my @copy_cfg = (); + @copy_cfg = @btn_cfg; + foreach (@copy_cfg) { + my %tmphash = %$_; + if ( defined( $tmphash{panel_context} ) ) { + if ( $tmphash{panel_context} eq "*" ) { + foreach my $contextoahora (@contextos) { + $contador++; + while ( my ( $key, $val ) = each(%tmphash) ) { + if ( $key eq "panel_context" ) { + $val = $contextoahora; + } + $btn_cfg[$contador]{$key} = $val; + } + } + } + } + } + + # We finished reading the file, now we populate our + # structures with the relevant data + my %rectangles_counter; + my %legends_counter; + my %images_counter; + + my $cont_auto = 0; + CONFIG: + foreach (@btn_cfg) { + my @positions = (); + my %tmphash = %$_; + + if ( defined( $tmphash{panel_context} ) ) { + if ( $tmphash{panel_context} eq "*" ) { + + # We skip the * panel_context because we already + # expand them to every context possible before + next CONFIG; + } + } + if ( $tmphash{channel} =~ /^AUTO/i ) { + $auto_buttons = 1; + while ( my ( $key, $val ) = each(%tmphash) ) { + $auto_config[$cont_auto]{$key} = $val; + } + $cont_auto++; + next CONFIG; + } + + if ( $tmphash{channel} =~ /^_/ ) { + $regexp_buttons = 1; + } + elsif ( $tmphash{channel} =~ /^QUEUEAGENT\//i ) { + $queueagent_buttons = 1; + } + elsif ( $tmphash{channel} =~ /^image$/i ) { + + # Image config primitive + + if ( defined( $tmphash{panel_context} ) ) { + $tmphash{panel_context} =~ tr/a-z/A-Z/; + $tmphash{panel_context} =~ s/^DEFAULT$//xms; + } + else { + $tmphash{panel_context} = ""; + } + my $conttemp = $tmphash{panel_context}; + if ( $conttemp eq "" ) { $conttemp = "GENERAL"; } + + if ( !defined( $tmphash{src} ) ) { + next CONFIG; + } + if ( !defined( $tmphash{url} ) ) { + $tmphash{url} = "no"; + } + if ( !defined( $tmphash{target} ) ) { + $tmphash{target} = "NONTARFOP"; + } + $images_counter{$conttemp}++; + if ( $images_counter{$conttemp} > 1 ) { + $images{$conttemp} .= "&"; + } + $total_images{$conttemp}++; + $images{$conttemp} .= "image_$images_counter{$conttemp}=" . $tmphash{x} . ","; + $images{$conttemp} .= $tmphash{y} . ","; + $images{$conttemp} .= $tmphash{src} . ","; + $images{$conttemp} .= $tmphash{url} . ","; + $images{$conttemp} .= $tmphash{target}; + next CONFIG; + + } + elsif ( $tmphash{channel} =~ /^legend$/i ) { + + # Legend config primitive + + if ( defined( $tmphash{panel_context} ) ) { + $tmphash{panel_context} =~ tr/a-z/A-Z/; + $tmphash{panel_context} =~ s/^DEFAULT$//xms; + } + else { + $tmphash{panel_context} = ""; + } + my $conttemp = $tmphash{panel_context}; + if ( $conttemp eq "" ) { $conttemp = "GENERAL"; } + + if ( !defined( $tmphash{text} ) ) { + $tmphash{text} = "LEGEND"; + } + if ( !defined( $tmphash{x} ) ) { + $tmphash{x} = 1; + } + if ( !defined( $tmphash{y} ) ) { + $tmphash{y} = 1; + } + if ( !defined( $tmphash{font_size} ) ) { + $tmphash{font_size} = 16; + } + if ( !defined( $tmphash{font_color} ) ) { + $tmphash{font_color} = "000000"; + } + if ( !defined( $tmphash{use_embed_fonts} ) ) { + $tmphash{use_embed_fonts} = 1; + } + if ( !defined( $tmphash{font_family} ) ) { + $tmphash{font_family} = "Arial"; + } + if ( !defined( $tmphash{no_base64} ) ) { + $tmphash{no_base64} = 0; + } + if ( $tmphash{no_base64} == 0 ) { + $tmphash{text} = encode_base64( $tmphash{text} ); + } + if ( !defined( $tmphash{url} ) ) { + $tmphash{url} = "no"; + } + if ( !defined( $tmphash{target} ) ) { + $tmphash{target} = "NONTARFOP"; + } + $legends_counter{$conttemp}++; + if ( $legends_counter{$conttemp} > 1 ) { + $legends{$conttemp} .= "&"; + } + $total_legends{$conttemp}++; + $legends{$conttemp} .= "legend_$legends_counter{$conttemp}=" . $tmphash{x} . ","; + $legends{$conttemp} .= $tmphash{y} . ","; + $legends{$conttemp} .= $tmphash{text} . ","; + $legends{$conttemp} .= $tmphash{font_size} . ","; + $legends{$conttemp} .= $tmphash{font_family} . ","; + $legends{$conttemp} .= $tmphash{font_color} . ","; + $legends{$conttemp} .= $tmphash{use_embed_fonts} . ","; + $legends{$conttemp} .= $tmphash{no_base64} . ","; + $legends{$conttemp} .= $tmphash{url} . ","; + $legends{$conttemp} .= $tmphash{target}; + next CONFIG; + } + elsif ( $tmphash{channel} =~ /^RECTANGLE$/i ) { + + # Rectangle config primitive + if ( defined( $tmphash{panel_context} ) ) { + $tmphash{panel_context} =~ tr/a-z/A-Z/; + $tmphash{panel_context} =~ s/^DEFAULT$//; + } + else { + $tmphash{panel_context} = ""; + } + my $conttemp = $tmphash{panel_context}; + if ( $conttemp eq "" ) { $conttemp = "GENERAL"; } + + if ( !defined( $tmphash{x} ) ) { + $tmphash{x} = 1; + } + if ( !defined( $tmphash{y} ) ) { + $tmphash{y} = 1; + } + if ( !defined( $tmphash{width} ) ) { + $tmphash{width} = 1; + } + if ( !defined( $tmphash{height} ) ) { + $tmphash{height} = 1; + } + if ( !defined( $tmphash{line_width} ) ) { + $tmphash{line_width} = 1; + } + if ( !defined( $tmphash{line_color} ) ) { + $tmphash{line_color} = "0x000000"; + } + if ( !defined( $tmphash{fade_color1} ) ) { + $tmphash{fade_color1} = "0xd0d0d0"; + } + if ( !defined( $tmphash{fade_color2} ) ) { + $tmphash{fade_color2} = "0xd0d000"; + } + if ( !defined( $tmphash{rnd_border} ) ) { + $tmphash{rnd_border} = 3; + } + if ( !defined( $tmphash{alpha} ) ) { + $tmphash{alpha} = 100; + } + if ( !defined( $tmphash{layer} ) ) { + $tmphash{layer} = "bottom"; + } + + $rectangles_counter{$conttemp}++; + if ( $rectangles_counter{$conttemp} > 1 ) { + $shapes{$conttemp} .= "&"; + } + $total_shapes{$conttemp}++; + $shapes{$conttemp} .= "rect_$rectangles_counter{$conttemp}=" . $tmphash{x} . ","; + $shapes{$conttemp} .= $tmphash{y} . ","; + $shapes{$conttemp} .= $tmphash{width} . ","; + $shapes{$conttemp} .= $tmphash{height} . ","; + $shapes{$conttemp} .= $tmphash{line_width} . ","; + $shapes{$conttemp} .= $tmphash{line_color} . ","; + $shapes{$conttemp} .= $tmphash{fade_color1} . ","; + $shapes{$conttemp} .= $tmphash{fade_color2} . ","; + $shapes{$conttemp} .= $tmphash{rnd_border} . ","; + $shapes{$conttemp} .= $tmphash{alpha} . ","; + $shapes{$conttemp} .= $tmphash{layer}; + next CONFIG; + } + + if ( !defined( $tmphash{position} ) ) { + log_debug( "** Ignored button $tmphash{'channel'}, position?", 16 ) if DEBUG; + next CONFIG; + } + + if ( !defined( $tmphash{alarm} ) ) { + $tmphash{alarm} = "0"; + + } + if ( !defined( $tmphash{url} ) ) { + $tmphash{url} = "0"; + } + + if ( !defined( $tmphash{target} ) ) { + $tmphash{target} = "0"; + } + + if ( !defined( $tmphash{server} ) ) { + $tmphash{server} = 0; + } + else { + if ( $tmphash{server} eq "*" ) { $tmphash{server} = 0; } + $tmphash{server} = $tmphash{server} - 1; + } + + if ( !defined( $tmphash{label} ) ) { + $tmphash{label} = $tmphash{channel}; + } + + if ( !defined( $tmphash{icon} ) ) { + $tmphash{icon} = "0"; + } + + # Local channels are case sensitive + my $canal_key = ""; + + if ( $tmphash{channel} =~ m/^local/i ) { + $canal_key = $tmphash{channel}; + } + else { + $canal_key = uc( $tmphash{channel} ); + } + + my $canal_key_case = $tmphash{channel_preserve_case}; + + if ( $canal_key =~ m/^PARK\d/ ) { + + # Change the PARKXXX tu PARK/XXX + $canal_key =~ s/PARK(.*)/PARK\/$1/g; + $canal_key_case =~ s/PARK(.*)/PARK\/$1/gi; + } + + if ( defined( $tmphash{panel_context} ) ) { + $tmphash{panel_context} =~ tr/a-z/A-Z/; + $tmphash{panel_context} =~ s/^DEFAULT$//; + } + else { + $tmphash{panel_context} = ""; + } + + if ( $tmphash{panel_context} ne "" ) { + + # We want to add the context in case we have the same button + # repeated in several panel_contexts. If we do not add it, then + # only the last panel context will prevail. + $canal_key .= "&" . $tmphash{panel_context}; + $canal_key_case .= "&" . $tmphash{panel_context}; + } + + if ( ( $tmphash{position} !~ /,/ ) + && ( $tmphash{position} !~ /-/ ) + && ( $canal_key =~ /^_/ ) ) + { + + # If it's a regexp button with just one position + # we fake the same position number to populate + # the array and make the button work anyways. + my $pos = $tmphash{position}; + $pos =~ s/(\d+),(\d+)/$1/g; + my $countpos = 2; + $tmphash{position} = ""; + if ( defined( $tmphash{count} ) ) { + $countpos = $tmphash{count}; + } + my $a = 0; + for ( $a = 0 ; $a < $countpos ; $a++ ) { + $tmphash{position} .= "$pos,"; + } + $tmphash{position} = substr( $tmphash{position}, 0, -1 ); + $no_counter = 1; + } + else { + $no_counter = 0; + } + + if ( $tmphash{position} =~ /[,-]/ ) { + + my $canalidx = $tmphash{server} . "^" . $tmphash{channel}; + + if ( defined( $tmphash{panel_context} ) + && $tmphash{panel_context} ne "" ) + { + $canalidx .= "&" . $tmphash{panel_context}; + } + $instancias{ uc($canalidx) }{""} = 0; + + my @ranges = split( /,/, $tmphash{position} ); + foreach my $valu (@ranges) { + if ( $valu !~ m/-/ ) { + if ( $valu eq "n" ) { + my $lastpos = $lastposition{ $tmphash{panel_context} }; + if ( is_number($lastpos) ) { + $lastpos++; + $lastposition{ $tmphash{panel_context} } = $lastpos; + $valu = $lastpos; + push @positions, $valu; + last; + } + } + push @positions, $valu; + } + else { + my @range2 = split( /-/, $valu ); + my $menor = $range2[0] < $range2[1] ? $range2[0] : $range2[1]; + my $mayor = $range2[0] > $range2[1] ? $range2[0] : $range2[1]; + my @newrange = $menor .. $mayor; + foreach my $valevale (@newrange) { + push @positions, $valevale; + } + } + } + + my $count = 0; + foreach my $pos (@positions) { + $count++; + my $indice_contexto = $pos; + my $chan_trunk = $tmphash{channel} . "=" . $count; + my $chan_trunk_case = $tmphash{channel_preserve_case} . "=" . $count; + if ( $tmphash{panel_context} ne "" ) { + $chan_trunk .= "&" . $tmphash{panel_context}; + $chan_trunk_case .= "&" . $tmphash{panel_context}; + $indice_contexto .= "@" . $tmphash{panel_context}; + $pos .= "@" . $tmphash{panel_context}; + } + if ( $chan_trunk =~ m/^QUEUE/i ) { + $buttons_queue{ uc("$tmphash{server}^$chan_trunk") } = $pos; + } + $buttons_preserve_case{"$tmphash{server}^$chan_trunk_case"} = $pos; + if ( defined( $tmphash{astdbkey} ) ) { + $buttons_astdbkey{"$tmphash{server}^$chan_trunk_case"} = $tmphash{astdbkey}; + } + $buttons{ uc("$tmphash{server}^$chan_trunk") } = $pos; + $textos{$indice_contexto} = $tmphash{label}; + if ( !defined( $tmphash{no_label_counter} ) ) { $tmphash{no_label_counter} = 0; } + if ( $no_counter == 0 && $tmphash{no_label_counter} == 0 ) { + $textos{$indice_contexto} .= " " . $count; + } + $iconos{$indice_contexto} = $tmphash{icon}; + $urls{$indice_contexto} = $tmphash{url}; + $alarms{$indice_contexto} = $tmphash{alarm}; + $targets{$indice_contexto} = $tmphash{target}; + $button_server{$pos} = $tmphash{server}; + + # Saves last position for the button@context + $lastposition{ $tmphash{panel_context} } = $pos; + log_debug( qq[** $tmphash{server}^$chan_trunk in position $pos], 16 ) if DEBUG; + } + } + else { + my $lastpos = 0; + $lastpos = $lastposition{ $tmphash{panel_context} } + if defined( $lastposition{ $tmphash{panel_context} } ); + if ( $tmphash{position} eq "n" ) { + if ( is_number($lastpos) ) { + $lastpos++; + $lastposition{ $tmphash{panel_context} } = $lastpos; + } + } + else { + $lastpos = $tmphash{position}; + $lastposition{ $tmphash{panel_context} } = $lastpos; + } + + log_debug( qq[** $tmphash{channel} in next position $lastpos], 16 ) if DEBUG; + + if ( $tmphash{panel_context} ne "" ) { + + if ( $canal_key =~ m/^QUEUE/i ) { + $buttons_queue{ uc("$tmphash{server}^$canal_key") } = $lastpos . "\@" . $tmphash{panel_context}; + } + $buttons{"$tmphash{server}^$canal_key"} = $lastpos . "\@" . $tmphash{panel_context}; + $buttons_preserve_case{"$tmphash{server}^$canal_key_case"} = $lastpos . "\@" . $tmphash{panel_context}; + if ( defined( $tmphash{astdbkey} ) ) { + $buttons_astdbkey{"$tmphash{server}^$canal_key_case"} = $tmphash{astdbkey}; + } + + $textos{"$lastpos\@$tmphash{panel_context}"} = $tmphash{label}; + $iconos{"$lastpos\@$tmphash{panel_context}"} = $tmphash{icon}; + $urls{"$lastpos\@$tmphash{panel_context}"} = $tmphash{url}; + $alarms{"$lastpos\@$tmphash{panel_context}"} = $tmphash{alarm}; + $targets{"$lastpos\@$tmphash{panel_context}"} = $tmphash{target}; + $button_server{ $buttons{"$tmphash{server}^$canal_key"} } = $tmphash{server}; + } + else { + if ( $canal_key =~ /^_/ ) { + $canal_key .= "=1"; + } + + if ( $canal_key =~ m/^QUEUE/i ) { + $buttons_queue{ uc("$tmphash{server}^$canal_key") } = $lastpos; + } + $buttons{"$tmphash{server}^$canal_key"} = $lastpos; + $buttons_preserve_case{"$tmphash{server}^$canal_key_case"} = $lastpos; + if ( defined( $tmphash{astdbkey} ) ) { + $buttons_astdbkey{"$tmphash{server}^$canal_key_case"} = $tmphash{astdbkey}; + } + $textos{$lastpos} = $tmphash{label}; + $iconos{$lastpos} = $tmphash{icon}; + $urls{$lastpos} = $tmphash{url}; + $alarms{$lastpos} = $tmphash{alarm}; + $targets{$lastpos} = $tmphash{target}; + $button_server{ $buttons{"$tmphash{server}^$canal_key"} } = $tmphash{server}; + } + } + + @positions = unique(@positions); + + if ( defined( $tmphash{groupcount} ) ) { + my $count = @positions; + if ( $count == 0 ) { + push @positions, $lastposition{ $tmphash{panel_context} }; + } + if ( $tmphash{groupcount} eq "true" || $tmphash{groupcount} eq "1" ) { + my $agre_context = ""; + if ( $tmphash{panel_context} ne "" ) { + $agre_context = "\@" . $tmphash{panel_context}; + } + foreach my $pos (@positions) { + $group_count{"$pos$agre_context"} = 1; + } + } + } + + if ( defined( $tmphash{privacy} ) ) { + my $count = @positions; + if ( $count == 0 ) { + push @positions, $lastposition{ $tmphash{panel_context} }; + } + if ( $tmphash{privacy} eq "true" || $tmphash{privacy} eq "1" ) { + my $agre_context = ""; + if ( $tmphash{panel_context} ne "" ) { + $agre_context = "\@" . $tmphash{panel_context}; + } + foreach my $pos (@positions) { + $clid_private{"$pos$agre_context"} = 1; + } + } + } + + if ( defined( $tmphash{no_rectangle} ) ) { + my $count = @positions; + if ( $count == 0 ) { + push @positions, $lastposition{ $tmphash{panel_context} }; + } + + if ( $tmphash{no_rectangle} eq "true" || $tmphash{no_rectangle} eq "1" ) { + my $pcont = $tmphash{panel_context}; + if ( $pcont eq "" ) { $pcont = "GENERAL"; } + foreach my $pos (@positions) { + $pos =~ s/\@$pcont//g; + $no_rectangle{$pcont}{$pos} = 1; + } + } + } + + if ( defined( $tmphash{background} ) ) { + my $count = @positions; + if ( $count == 0 ) { + push @positions, $lastposition{ $tmphash{panel_context} }; + } + + my $pcont = $tmphash{panel_context}; + if ( $pcont eq "" ) { $pcont = "GENERAL"; } + foreach my $pos (@positions) { + $pos =~ s/\@$pcont//g; + $background{$pcont} .= "&bg$pos=$tmphash{background}"; + } + } + + if ( defined( $tmphash{extension} ) ) { + if ( defined( $tmphash{context} ) ) { + + $extension_transfer{"$tmphash{server}^$canal_key"} = $tmphash{server} . "^" . $tmphash{extension} . "@" . $tmphash{context}; + + } + else { + $extension_transfer{"$tmphash{server}^$canal_key"} = $tmphash{server} . "^" . $tmphash{extension}; + } + if ( defined( $tmphash{voicemail_context} ) ) { + $mailbox{"$tmphash{server}^$canal_key"} = $tmphash{extension} . "@" . $tmphash{voicemail_context}; + } + } + if ( defined( $tmphash{mailbox} ) ) { + $mailbox{"$tmphash{server}^$canal_key"} = $tmphash{mailbox}; + } + if ( defined( $tmphash{voicemailext} ) ) { + my $indicevm = $lastposition{ $tmphash{panel_context} }; + if ( $tmphash{panel_context} ne "" ) { + $indicevm .= "\@$tmphash{panel_context}"; + } + $tovoicemail{$indicevm} = $tmphash{voicemailext}; + } + if ( defined( $tmphash{spyext} ) ) { + my $indicespy = $lastposition{ $tmphash{panel_context} }; + if ( $tmphash{panel_context} ne "" ) { + $indicespy .= "\@$tmphash{panel_context}"; + } + $tospy{$indicespy} = $tmphash{spyext}; + } + + $/ = "\0"; + } + %extension_transfer_reverse = reverse %extension_transfer; + %buttons_reverse = reverse %buttons; + %buttons_queue_reverse = reverse %buttons_queue; +} + +sub genera_config { + + # This sub generates the file variables.txt that is read by the + # swf movie on load, with info about buttons, layout, etc. + + my @textsclients = ( + 'detail_title', 'detail_from', 'detail_to', 'security_code_title', + 'btn_security_text', 'btn_restart_text', 'btn_reload_text', 'btn_debug_text', + 'btn_help_text', 'tab_call_text', 'tab_queue_text', 'calls_taken_text', + 'no_data_text', 'debug_window_title', 'detail_duration', 'clid_label', + 'version_mismatch' + ); + + $/ = "\n"; + my %style_variables; + my @contextos = (); + my @unique_contexts = (); + my $contextoactual = ""; + my $highest_position = 0; + my @style_include = (); + + foreach my $archi (@styleinclude) { + open( STYLE, "<$directorio/$archi" ) + or die("Could not open $archi for reading"); + while (