<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.innovaphone.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Inno-mst</id>
	<title>innovaphone wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.innovaphone.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Inno-mst"/>
	<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Special:Contributions/Inno-mst"/>
	<updated>2026-05-07T16:02:40Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=79281</id>
		<title>Reference16r1:Concept LDAP Replication</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=79281"/>
		<updated>2026-03-27T14:22:45Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: updated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;LDAP replication concepts, mainly the differences between full- and incremental replication are going to be covered within this article. The focus is on replication between PBXs.&lt;br /&gt;
= Glossary =&lt;br /&gt;
;Admin object: An LDAP DB object named &amp;quot;_ADMIN_&amp;quot;.&lt;br /&gt;
;Config restore: The act of administratively uploading an configuration file to a box.&lt;br /&gt;
;Epoch: A &#039;&#039;RootDSE&#039;&#039; value. The current value of the GUID of the &#039;&#039;Admin object&#039;&#039;. &lt;br /&gt;
;Flashdir, Flashman: Flash Directory, Flash Manager with Flashdir sitting on-top of Flashman. The Flashdir exchanges API messages with the Flashman to persistently add, replace, and delete LDAP objects.&lt;br /&gt;
;Full Replication: Every object is going to be queried by replication partners.&lt;br /&gt;
;GUID: A unique 16-byte value. Every object contains an attribute &#039;&#039;GUID&#039;&#039;.&lt;br /&gt;
;Incremental Replication: Only objects written since a last-known point in time will be queried.&lt;br /&gt;
;Master: The replication partner acting as an LDAP server.&lt;br /&gt;
;Notify Search: A single LDAP search remains active until a cancellation. A server responds to it with multiple search responses for all objects being modified after the notify search was received.&lt;br /&gt;
;Paged Search/Paging: A means to iterate over an entire database in chunks or pages of a fixed maximum size.&lt;br /&gt;
;Replication Filter: A static LDAP filter supposed to be active during a replication session. &lt;br /&gt;
;RootDSE (Root Directory Service Entry)&lt;br /&gt;
: Directory-specific entry. A collection of properties and capabilities that can be read by any LDAP client. The RootDSE is accessible without authentication and by providing a special search filter.&lt;br /&gt;
;Slave: The replication partner acting as an LDAP client.&lt;br /&gt;
;Tombstones, isDeleted: Deleted objects aren&#039;t deleted immediately from storage. Instead, such objects are marked with an attribute &#039;&#039;isDeleted&#039;&#039;.&lt;br /&gt;
;USN (Update sequence number)&lt;br /&gt;
: Unique value incremented by 1 on every write. It is unique within every local LDAP DB.&lt;br /&gt;
;RUSN (Remote update sequence number)&lt;br /&gt;
: Unique value over the whole system over all LDAP DBs.&lt;br /&gt;
; RWR (Replication Write)&lt;br /&gt;
: Optional attribute on an object that is incremented by 1 on every update on a slave locally. Indicator that these changes have to be committed to the upper ldap master.&lt;br /&gt;
&lt;br /&gt;
= Technical concept of replication as client =&lt;br /&gt;
The replication of a source via LDAP is basically divided into 3 phases that must be passed through when synchronization is started.&lt;br /&gt;
 &lt;br /&gt;
;1st phase &#039;&#039;remote&#039;&#039;&lt;br /&gt;
The first phase is the &amp;quot;remote&amp;quot; phase and ensures a comparison of any delta between the remote data stock and the local data stock. (In other words, objects that are missing locally are created).&lt;br /&gt;
&lt;br /&gt;
The LDAP client requests a paging version of all objects of the LDAP server. The client then receives back page by page (2 objects) per request. If necessary, objects in the local database are updated accordingly.&lt;br /&gt;
&lt;br /&gt;
During this phase the following is shown in the status:&lt;br /&gt;
 remote: Active&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
;2nd phase &#039;&#039;local&#039;&#039;&lt;br /&gt;
The second phase is the &amp;quot;local&amp;quot; phase and ensures a comparison of any delta between the local data stock and the remote data stock. (In other words, objects that need to be deleted locally).&lt;br /&gt;
&lt;br /&gt;
The LDAP client makes an LDAP query per local object (which it knows from its local database) based on the &#039;&#039;guid&#039;&#039; to the LDAP server. If the LDAP server knows this object, it returns the entire object so that the client can update the object locally if necessary. If the object does not exist in the LDAP server, it is removed locally.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status shows the following:&lt;br /&gt;
 remote: Stopped&lt;br /&gt;
 local: Active&lt;br /&gt;
&lt;br /&gt;
;3rd phase &#039;&#039;notify&#039;&#039;&lt;br /&gt;
The third phase is the &amp;quot;notify&amp;quot; phase, in which there is no longer an open delta between the two sources, and future changes are synchronised.&lt;br /&gt;
In this phase, a permanent TCP connection exists between the LDAP client and the LDAP server and is used for the LDAP server to notify the LDAP client when a change has occurred so that the client can create or update the record in the local database.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status will show the following:&lt;br /&gt;
 remote: Completed&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
It is important to note that:&lt;br /&gt;
* if a problem occurs (e.g. due to the interruption of a phase or e.g. loss of the TCP connection to the LDAP server) the synchronisation starts again from the first phase (&amp;quot;local&amp;quot;)&lt;br /&gt;
* the local attribute &#039;&#039;usn&#039;&#039; will not be replicated. Each ldap node manages its own local &#039;&#039;usn&#039;&#039;&lt;br /&gt;
* if you use a configured [[{{NAMESPACE}}:Services/LDAP/Replicator|&#039;&#039;Poll Timer&#039;&#039;]] the notify feature will not be used in this ldap session&lt;br /&gt;
&lt;br /&gt;
=Algorithmic and Technical Details=&lt;br /&gt;
This section covers details the incremental replication is based on, enabling the transition from full- to incremental replication and back from incremental- to full replication.&lt;br /&gt;
==epoch==&lt;br /&gt;
The master&#039;s Root DSE contains or does not contain an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;, reflecting the GUID attribute of an existing object by the name &#039;&#039;&#039;_ADMIN_&#039;&#039;&#039;. A slave must permanently store the epoch as a persistent VARiable &#039;&#039;&#039;epoch&#039;&#039;&#039;.&lt;br /&gt;
*Slave connects and BINDs to master&lt;br /&gt;
*Slave requests Root DSE from master&lt;br /&gt;
*Slave evalutates &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is not present&lt;br /&gt;
***=&amp;gt;Full replication&lt;br /&gt;
***Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is present&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; matches slave&#039;s copy&lt;br /&gt;
****=&amp;gt;Incremental replication&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; does not match slave&#039;s copy&lt;br /&gt;
****Delete copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
****=&amp;gt;Full replication&lt;br /&gt;
****Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
*Slave, persistent &#039;&#039;epoch&#039;&#039; storage&lt;br /&gt;
**Variable: &#039;&#039;&#039;LDAPI/epoc-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==USN Processing==&lt;br /&gt;
Every object features the attribute &#039;&#039;&#039;USN&#039;&#039;&#039;. A slave keeps track of the highest USN seen within all objects rx&#039;ed from a master. &lt;br /&gt;
*Slave checks USN for objects rx&#039;ed from master&lt;br /&gt;
**No local record of a highest USN&lt;br /&gt;
***=&amp;gt; Store current USN as highest USN&lt;br /&gt;
**Local copy of highest USN existing&lt;br /&gt;
***RX&#039;ed USN greater than local USN copy&lt;br /&gt;
****=&amp;gt; Store current USN as highest USN&lt;br /&gt;
***RX&#039;ed USN less or equal than local USN copy&lt;br /&gt;
****=&amp;gt; NOP, nothing to be done&lt;br /&gt;
&lt;br /&gt;
*Slave, persistent USN storage&lt;br /&gt;
**Replication completed - at the end of a full or incremental replication. Also, when rx&#039;ing notify search results from a master.&lt;br /&gt;
***=&amp;gt; Persistently storing the volatile memorized highest USN&lt;br /&gt;
**Variable: &#039;&#039;&#039;LDAPI/r-usn/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Paging==&lt;br /&gt;
Incremental paging requires an additional filter term spedifying a USN value. &lt;br /&gt;
*1st Search&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (&amp;amp;(objectclass=*)&#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039;) The USN-Term contains the highest USN rx&#039;ed during last replication run, plus 1.&lt;br /&gt;
***Cookie &amp;lt;empty&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate &#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039; and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
*2nd Search,..&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (objectclass=*)&lt;br /&gt;
***Cookie &amp;lt;Last Cookie content rx&#039;ed from server&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate cookie and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
==Root DSE==&lt;br /&gt;
Because of the Flash Directory also exporting some infos into the Root DSE it probably makes sense to inform there about the current GUID of the &#039;&#039;_admin_&#039;&#039; object. Following excerpt represents this by an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;. A slave can comfortably compare this to its copy of the epoch last seen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Getting 1 entries:&lt;br /&gt;
&amp;gt;&amp;gt; Dn: &lt;br /&gt;
	1&amp;gt; epoch: 0B1581AF783F67018F170050568214B4; &lt;br /&gt;
..&lt;br /&gt;
	1&amp;gt; ldapServiceName: IP6013-50-00-68; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==VARs==&lt;br /&gt;
Noteable variables for persistent storage of some replication control data within a slave&#039;s VARs section.&lt;br /&gt;
;Remote highest rusn:&lt;br /&gt;
 vars create LDAPI/r-rusn/cn=PBX0 p 102&lt;br /&gt;
&lt;br /&gt;
;Remote highest usn:&lt;br /&gt;
 vars create LDAPI/r-usn/cn=PBX0 p 548&lt;br /&gt;
&lt;br /&gt;
;Remote last seen epoch, saved per view:&lt;br /&gt;
 vars create LDAPI/epoc-r/cn=KPBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
 vars create LDAPI/epoc-r/cn=PBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
&lt;br /&gt;
==Restore on Master==&lt;br /&gt;
A mechanism provides information by a replication master to replication slaves that a full replication run shall take place. That mechanism gets triggered by an upload of a configuration to a master. A restore of an older configuration on a master causes a new GUID for the object with the name &#039;&#039;_ADMIN_&#039;&#039;.&lt;br /&gt;
*A new configuration is going to be uploaded&lt;br /&gt;
*The Flash Directory processes the module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 erase-all&amp;lt;/pre&amp;gt;&lt;br /&gt;
**The FLASH Directory erases it&#039;s entire database, awaiting further commands&lt;br /&gt;
*The FLASH Directory processes a module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 add-item 102 (cn=_ADMIN_)..(guid;bin=5238705224C067016FD10090334117BE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
**This is the Admin object. Before being stored, it will now get assigned a new random GUID&lt;br /&gt;
*The Admin object&#039;s new GUID gets now promoted as the new &#039;&#039;epoch&#039;&#039; for the master&#039;s database. Replication slave&#039;s are supposed to detect a change of the DB&#039;s epoch and to replicate in full.&lt;br /&gt;
&lt;br /&gt;
==Detecting Obsolete Objects==&lt;br /&gt;
Objects with the isDeleted attribute, a.k.a. tombstones, shall persist ideally forever. In practice tombstones get erased after a timeout. Only the most recent tombstone (tombstone with highest USN) remains.&lt;br /&gt;
;Current tombstone timeout: 48 hours&lt;br /&gt;
===Behaviour during Full Replication===&lt;br /&gt;
The local phase takes place in full. The replicator pages over all local objects and compares them with the master to see if they are still present.&lt;br /&gt;
===Behaviour during Incremental Replication===&lt;br /&gt;
The local phase is completely eliminated, respectively skipped.&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75845</id>
		<title>Reference16r1:Concept LDAP Replication</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75845"/>
		<updated>2025-03-21T17:10:42Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: Incremental replication postponed for 15r1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note: The feature has not successfully passed through our quality assurance process yet and will therefore not be included in the 15r1 final release. However, we will release this feature separately at a later date. Up until further notice or until removal of this note, please refer to a pre-15r1 version of this article.&#039;&#039;&#039;  &lt;br /&gt;
&lt;br /&gt;
LDAP replication concepts, mainly the differences between full- and incremental replication are going to be covered within  this article. The focus is on replication between PBXs. &lt;br /&gt;
&lt;br /&gt;
= Glossary =&lt;br /&gt;
;Admin Object: An LDAP DB object named &amp;quot;_ADMIN_&amp;quot;.&lt;br /&gt;
;Config Restore: The act of administratively uploading an old configuration to a box. Can be accomplished via the firmware&#039;s maintenance UI or in-part via a PBX UI.&lt;br /&gt;
;Epoch: A Root DSE value. The current value of the GUID of the object Admin object. &lt;br /&gt;
;Flashdir, Flashman: Flash Directory, Flash Manager with Flashdir sitting on-top of Flashman. The Flashdir exchange API messages with the Flashman to persistently add, replace, delete LDAP objects. &lt;br /&gt;
;Full Replication: Every object is going to be queried and or handled by replication partners.&lt;br /&gt;
;GUID: A unique 16-byte value. Every object contains an attribute GUID.&lt;br /&gt;
;Incremental Replication: Only objects written since a last-known point in time will be queried and or handled.&lt;br /&gt;
;Master: The replication partner acting as an LDAP server.&lt;br /&gt;
;Notify Search: A single LDAP search remaing active until a cancellation. A server responds to it with multiple search responses for all objects being modified after the notify search was received.&lt;br /&gt;
;Paged Search/Paging: A means to iterate over an entire database in chunks or pages of a fixed maximum size.&lt;br /&gt;
;Replication Filter: A static LDAP filter supposed to be active during a replication session. &lt;br /&gt;
;Root DSE: Directory-specific entry. A collection of few properties and capabilities that can be read by any LDAP client. The Root DSE is accessible without authentication and by providing a special search filter.&lt;br /&gt;
;Slave: The replication partner acting as an LDAP client.&lt;br /&gt;
;Tombstones, isDeleted: Deleted objects aren&#039;t deleted immediately from storage. Instead, such objects are marked with an attribute isDeleted.&lt;br /&gt;
;USN: Update Sequence Number, a 64-bit value incremented by 1 on every write. It is deemed to never wrap-around and to be unique within an LDAP DB. Every object contains an attribute USN.&lt;br /&gt;
&lt;br /&gt;
= Technical concept of replication as client =&lt;br /&gt;
The replication of a source via LDAP is basically divided into 3 phases that must be passed through when synchronization is started.&lt;br /&gt;
 &lt;br /&gt;
;1st phase &#039;&#039;local&#039;&#039;&lt;br /&gt;
The first phase is the &amp;quot;local&amp;quot; phase and ensures a comparison of any delta between the local data stock and the remote data stock. (In other words, objects that need to be deleted locally).&lt;br /&gt;
&lt;br /&gt;
The LDAP client makes an LDAP query per local object (which it knows from its local database) based on the &#039;&#039;guid&#039;&#039; to the LDAP server. If the LDAP server knows this object, it returns the entire object so that the client can update the object locally if necessary. If the object does not exist in the LDAP server, it is removed locally.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status shows the following:&lt;br /&gt;
 remote: Stopped&lt;br /&gt;
 local: Active&lt;br /&gt;
&lt;br /&gt;
;2nd phase &#039;&#039;remote&#039;&#039;&lt;br /&gt;
The second phase is the &amp;quot;remote&amp;quot; phase and ensures a comparison of any delta between the remote data stock and the local data stock. (In other words, objects that are missing locally are created).&lt;br /&gt;
&lt;br /&gt;
The LDAP client requests a paging version of all objects of the LDAP server. The client then receives back page by page (2 objects) per request. If necessary, objects in the local database are updated accordingly.&lt;br /&gt;
&lt;br /&gt;
During this phase the following is shown in the status:&lt;br /&gt;
 remote: Active&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
;3rd phase &#039;&#039;notify&#039;&#039;&lt;br /&gt;
The third phase is the &amp;quot;notify&amp;quot; phase, in which there is no longer an open delta between the two sources, and future changes are synchronised.&lt;br /&gt;
In this phase, a permanent TCP connection exists between the LDAP client and the LDAP server and is used for the LDAP server to notify the LDAP client when a change has occurred so that the client can create or update the record in the local database.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status will show the following:&lt;br /&gt;
 remote: Completed&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
It is important to note that:&lt;br /&gt;
* if a problem occurs (e.g. due to the interruption of a phase or e.g. loss of the TCP connection to the LDAP server) the synchronisation starts again from the first phase (&amp;quot;local&amp;quot;)&lt;br /&gt;
* the local attribute &#039;&#039;usn&#039;&#039; will not be replicated. Each ldap node manages its own local &#039;&#039;usn&#039;&#039;&lt;br /&gt;
* if you use a configured [[{{NAMESPACE}}:Services/LDAP/Replicator|&#039;&#039;Poll Timer&#039;&#039;]] the notify feature will not be used in this ldap session&lt;br /&gt;
&lt;br /&gt;
=Algorithmic and Technical Details=&lt;br /&gt;
This section covers details the incremental replication is based on, enabling the transition from full- to incremental replication and back from incremental- to full replication.&lt;br /&gt;
==epoch==&lt;br /&gt;
The master&#039;s Root DSE contains or does not contain an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;, reflecting the GUID attribute of an existing object by the name &#039;&#039;&#039;_admin_&#039;&#039;&#039;. A slave must permanently store the epoch as a persistent VARiable &#039;&#039;&#039;epoch&#039;&#039;&#039;.&lt;br /&gt;
*Slave connects and BINDs to master&lt;br /&gt;
*Slave requests Root DSE from master&lt;br /&gt;
*Slave evalutates &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is not present&lt;br /&gt;
***=&amp;gt;Full replication&lt;br /&gt;
***Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is present&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; matches slave&#039;s copy&lt;br /&gt;
****=&amp;gt;Incremental replication&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; does not match slave&#039;s copy&lt;br /&gt;
****Delete copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
****=&amp;gt;Full replication&lt;br /&gt;
****Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
*Slave, persistent &#039;&#039;epoch&#039;&#039; storage&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/epoc-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==USN Processing==&lt;br /&gt;
Every object features the attribute &#039;&#039;&#039;USN&#039;&#039;&#039;. A slave keeps track of the highest USN seen within all objects rx&#039;ed from a master. &lt;br /&gt;
*Slave checks USN for objects rx&#039;ed from master&lt;br /&gt;
**No local record of a highest USN&lt;br /&gt;
***=&amp;gt;Store current USN as highest USN&lt;br /&gt;
**Local copy of highest USN existing&lt;br /&gt;
***RX&#039;ed USN greater than local USN copy&lt;br /&gt;
****=&amp;gt;Store current USN as highest USN&lt;br /&gt;
***RX&#039;ed USN less or equal than local USN copy&lt;br /&gt;
****=&amp;gt;NOP, nothing to be done&lt;br /&gt;
&lt;br /&gt;
*Slave, persistent USN storage&lt;br /&gt;
**Replication completed - at the end of a full or incremental replication. Also, when rx&#039;ing notify search results from a master.&lt;br /&gt;
***=&amp;gt;Persistently storing the volatile memorized highest USN&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/u-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Paging==&lt;br /&gt;
Incremental paging requires an additional filter term spedifying a USN value. &lt;br /&gt;
*1st Search&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (&amp;amp;(objectclass=*)&#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039;) The USN-Term contains the highest USN rx&#039;ed during last replication run, plus 1.&lt;br /&gt;
***Cookie &amp;lt;empty&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate &#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039; and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
*2nd Search,..&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (objectclass=*)&lt;br /&gt;
***Cookie &amp;lt;Last Cookie content rx&#039;ed from server&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate cookie and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
==Root DSE==&lt;br /&gt;
Because of the Flash Directory also exporting some infos into the Root DSE it probably makes sense to inform there about the current GUID of the &#039;&#039;_admin_&#039;&#039; object. Following excerpt represents this by an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;. A slave can comfortably compare this to its copy of the epoch last seen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Getting 1 entries:&lt;br /&gt;
&amp;gt;&amp;gt; Dn: &lt;br /&gt;
	1&amp;gt; epoch: 0B1581AF783F67018F170050568214B4; &lt;br /&gt;
..&lt;br /&gt;
	1&amp;gt; ldapServiceName: IP6013-50-00-68; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==VARs==&lt;br /&gt;
Noteable variables for persistent storage of some replication control data within a slave&#039;s VARs section.&lt;br /&gt;
;LDAP Replication, remote highest USN:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/u-r/cn=PBX0 p 102&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/u-r/cn=KBX0 p 105&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;LDAP Replication, remote last seen epoch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/epoc-r/cn=KPBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/epoc-r/cn=PBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Restore on Master==&lt;br /&gt;
A mechanism provides information by a replication master to replication slaves that a full replication run shall take place. That mechanism gets triggered by an upload of a configuration to a master. A restore of an older configuration on a master causes a new GUID for the object with the name &#039;&#039;_ADMIN_&#039;&#039;.&lt;br /&gt;
*A new configuration is going to be uploaded&lt;br /&gt;
*The Flash Directory processes the module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 erase-all&amp;lt;/pre&amp;gt;&lt;br /&gt;
**The FLASH Directory erases it&#039;s entire database, awaiting further commands&lt;br /&gt;
*The FLASH Directory processes a module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 add-item 102 (cn=_ADMIN_)..(guid;bin=5238705224C067016FD10090334117BE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
**This is the Admin object. Before being stored, it will now get assigned a new random GUID&lt;br /&gt;
*The Admin object&#039;s new GUID gets now promoted as the new &#039;&#039;epoch&#039;&#039; for the master&#039;s database. Replication slave&#039;s are supposed to detect a change of the DB&#039;s epoch and to replicate in full.&lt;br /&gt;
&lt;br /&gt;
==Detecting Obsolete Objects==&lt;br /&gt;
Objects with the isDeleted attribute, a.k.a. tombstones, shall persist ideally forever. In practice tombstones get erased after a timeout. Only the most recent tombstone (tombstone with highest USN) remains.&lt;br /&gt;
;Current tombstone timeout: 48 hours&lt;br /&gt;
===Behaviour during Full Replication===&lt;br /&gt;
The local phase takes place in full. The replicator pages over all local objects and compares them with the master to see if they are still present.&lt;br /&gt;
===Behaviour during Incremental Replication===&lt;br /&gt;
The local phase is completely eliminated, respectively skipped.&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Services/LDAP/Rep-Status&amp;diff=75776</id>
		<title>Reference15r1:Services/LDAP/Rep-Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Services/LDAP/Rep-Status&amp;diff=75776"/>
		<updated>2025-03-18T09:04:08Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: simplifying&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The displayed &#039;&#039;&#039;replicator status&#039;&#039;&#039; updates every few seconds. The last ten activity messages of the replication are displayed below.&lt;br /&gt;
&lt;br /&gt;
== Status overview ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server:&#039;&#039;&#039; IP-address and port of the remote LDAP server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Full/Incremental Replication:&#039;&#039;&#039; Current state of the replication. The states are: &#039;&#039;Stop&#039;&#039;, &#039;&#039;Starting&#039;&#039;, &#039;&#039;Up&#039;&#039;, &#039;&#039;Down, Completed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;remote:&#039;&#039;&#039; Displays the state of the replication in poll direction.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;notify:&#039;&#039;&#039; Number of received notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;modify:&#039;&#039;&#039; Number of modified objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;paged:&#039;&#039;&#039; Number of objects received from remote directory server in response to paged-search requests.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no match:&#039;&#039;&#039; (AD-Only) Number of objects received and not matching the LDAP filter condition entered under Configuration/LDAP/Replicator.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;discarded:&#039;&#039;&#039; (AD-Only) Number of objects discarded, because there was no suitable MAP found.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;local:&#039;&#039;&#039; Displays the state of the replication in push direction.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;add:&#039;&#039;&#039; Number of locally added objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;del:&#039;&#039;&#039; Number of locally deleted objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;paged:&#039;&#039;&#039; Number of objects received from local flash directory in response to paged-search requests.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;modify:&#039;&#039;&#039; Number of locally modified objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;notify:&#039;&#039;&#039; Number of notifications that have arisen locally.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pending:&#039;&#039;&#039; Number of locally waiting objects.&lt;br /&gt;
&lt;br /&gt;
=Related Articles=&lt;br /&gt;
* [[{{NAMESPACE}}:Concept LDAP Replication]]&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75775</id>
		<title>Reference16r1:Concept LDAP Replication</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75775"/>
		<updated>2025-03-18T08:47:25Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Restore on Master */ Detailing intro and outro&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;LDAP replication concepts, mainly the differences between full- and incremental replication are going to be covered within  this article. The focus is on replication between PBXs. &lt;br /&gt;
= Glossary =&lt;br /&gt;
;Admin Object: An LDAP DB object named &amp;quot;_ADMIN_&amp;quot;.&lt;br /&gt;
;Config Restore: The act of administratively uploading an old configuration to a box. Can be accomplished via the firmware&#039;s maintenance UI or in-part via a PBX UI.&lt;br /&gt;
;Epoch: A Root DSE value. The current value of the GUID of the object Admin object. &lt;br /&gt;
;Flashdir, Flashman: Flash Directory, Flash Manager with Flashdir sitting on-top of Flashman. The Flashdir exchange API messages with the Flashman to persistently add, replace, delete LDAP objects. &lt;br /&gt;
;Full Replication: Every object is going to be queried and or handled by replication partners.&lt;br /&gt;
;GUID: A unique 16-byte value. Every object contains an attribute GUID.&lt;br /&gt;
;Incremental Replication: Only objects written since a last-known point in time will be queried and or handled.&lt;br /&gt;
;Master: The replication partner acting as an LDAP server.&lt;br /&gt;
;Notify Search: A single LDAP search remaing active until a cancellation. A server responds to it with multiple search responses for all objects being modified after the notify search was received.&lt;br /&gt;
;Paged Search/Paging: A means to iterate over an entire database in chunks or pages of a fixed maximum size.&lt;br /&gt;
;Replication Filter: A static LDAP filter supposed to be active during a replication session. &lt;br /&gt;
;Root DSE: Directory-specific entry. A collection of few properties and capabilities that can be read by any LDAP client. The Root DSE is accessible without authentication and by providing a special search filter.&lt;br /&gt;
;Slave: The replication partner acting as an LDAP client.&lt;br /&gt;
;Tombstones, isDeleted: Deleted objects aren&#039;t deleted immediately from storage. Instead, such objects are marked with an attribute isDeleted.&lt;br /&gt;
;USN: Update Sequence Number, a 64-bit value incremented by 1 on every write. It is deemed to never wrap-around and to be unique within an LDAP DB. Every object contains an attribute USN.&lt;br /&gt;
&lt;br /&gt;
= Technical concept of replication as client =&lt;br /&gt;
The replication of a source via LDAP is basically divided into 3 phases that must be passed through when synchronization is started.&lt;br /&gt;
 &lt;br /&gt;
;1st phase &#039;&#039;local&#039;&#039;&lt;br /&gt;
The first phase is the &amp;quot;local&amp;quot; phase and ensures a comparison of any delta between the local data stock and the remote data stock. (In other words, objects that need to be deleted locally).&lt;br /&gt;
&lt;br /&gt;
The LDAP client makes an LDAP query per local object (which it knows from its local database) based on the &#039;&#039;guid&#039;&#039; to the LDAP server. If the LDAP server knows this object, it returns the entire object so that the client can update the object locally if necessary. If the object does not exist in the LDAP server, it is removed locally.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status shows the following:&lt;br /&gt;
 remote: Stopped&lt;br /&gt;
 local: Active&lt;br /&gt;
&lt;br /&gt;
;2nd phase &#039;&#039;remote&#039;&#039;&lt;br /&gt;
The second phase is the &amp;quot;remote&amp;quot; phase and ensures a comparison of any delta between the remote data stock and the local data stock. (In other words, objects that are missing locally are created).&lt;br /&gt;
&lt;br /&gt;
The LDAP client requests a paging version of all objects of the LDAP server. The client then receives back page by page (2 objects) per request. If necessary, objects in the local database are updated accordingly.&lt;br /&gt;
&lt;br /&gt;
During this phase the following is shown in the status:&lt;br /&gt;
 remote: Active&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
;3rd phase &#039;&#039;notify&#039;&#039;&lt;br /&gt;
The third phase is the &amp;quot;notify&amp;quot; phase, in which there is no longer an open delta between the two sources, and future changes are synchronised.&lt;br /&gt;
In this phase, a permanent TCP connection exists between the LDAP client and the LDAP server and is used for the LDAP server to notify the LDAP client when a change has occurred so that the client can create or update the record in the local database.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status will show the following:&lt;br /&gt;
 remote: Completed&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
It is important to note that:&lt;br /&gt;
* if a problem occurs (e.g. due to the interruption of a phase or e.g. loss of the TCP connection to the LDAP server) the synchronisation starts again from the first phase (&amp;quot;local&amp;quot;)&lt;br /&gt;
* the local attribute &#039;&#039;usn&#039;&#039; will not be replicated. Each ldap node manages its own local &#039;&#039;usn&#039;&#039;&lt;br /&gt;
* if you use a configured [[{{NAMESPACE}}:Services/LDAP/Replicator|&#039;&#039;Poll Timer&#039;&#039;]] the notify feature will not be used in this ldap session&lt;br /&gt;
&lt;br /&gt;
=Algorithmic and Technical Details=&lt;br /&gt;
This section covers details the incremental replication is based on, enabling the transition from full- to incremental replication and back from incremental- to full replication.&lt;br /&gt;
==epoch==&lt;br /&gt;
The master&#039;s Root DSE contains or does not contain an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;, reflecting the GUID attribute of an existing object by the name &#039;&#039;&#039;_admin_&#039;&#039;&#039;. A slave must permanently store the epoch as a persistent VARiable &#039;&#039;&#039;epoch&#039;&#039;&#039;.&lt;br /&gt;
*Slave connects and BINDs to master&lt;br /&gt;
*Slave requests Root DSE from master&lt;br /&gt;
*Slave evalutates &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is not present&lt;br /&gt;
***=&amp;gt;Full replication&lt;br /&gt;
***Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is present&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; matches slave&#039;s copy&lt;br /&gt;
****=&amp;gt;Incremental replication&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; does not match slave&#039;s copy&lt;br /&gt;
****Delete copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
****=&amp;gt;Full replication&lt;br /&gt;
****Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
*Slave, persistent &#039;&#039;epoch&#039;&#039; storage&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/epoc-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==USN Processing==&lt;br /&gt;
Every object features the attribute &#039;&#039;&#039;USN&#039;&#039;&#039;. A slave keeps track of the highest USN seen within all objects rx&#039;ed from a master. &lt;br /&gt;
*Slave checks USN for objects rx&#039;ed from master&lt;br /&gt;
**No local record of a highest USN&lt;br /&gt;
***=&amp;gt;Store current USN as highest USN&lt;br /&gt;
**Local copy of highest USN existing&lt;br /&gt;
***RX&#039;ed USN greater than local USN copy&lt;br /&gt;
****=&amp;gt;Store current USN as highest USN&lt;br /&gt;
***RX&#039;ed USN less or equal than local USN copy&lt;br /&gt;
****=&amp;gt;NOP, nothing to be done&lt;br /&gt;
&lt;br /&gt;
*Slave, persistent USN storage&lt;br /&gt;
**Replication completed - at the end of a full or incremental replication. Also, when rx&#039;ing notify search results from a master.&lt;br /&gt;
***=&amp;gt;Persistently storing the volatile memorized highest USN&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/u-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Paging==&lt;br /&gt;
Incremental paging requires an additional filter term spedifying a USN value. &lt;br /&gt;
*1st Search&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (&amp;amp;(objectclass=*)&#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039;) The USN-Term contains the highest USN rx&#039;ed during last replication run, plus 1.&lt;br /&gt;
***Cookie &amp;lt;empty&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate &#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039; and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
*2nd Search,..&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (objectclass=*)&lt;br /&gt;
***Cookie &amp;lt;Last Cookie content rx&#039;ed from server&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate cookie and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
==Root DSE==&lt;br /&gt;
Because of the Flash Directory also exporting some infos into the Root DSE it probably makes sense to inform there about the current GUID of the &#039;&#039;_admin_&#039;&#039; object. Following excerpt represents this by an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;. A slave can comfortably compare this to its copy of the epoch last seen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Getting 1 entries:&lt;br /&gt;
&amp;gt;&amp;gt; Dn: &lt;br /&gt;
	1&amp;gt; epoch: 0B1581AF783F67018F170050568214B4; &lt;br /&gt;
..&lt;br /&gt;
	1&amp;gt; ldapServiceName: IP6013-50-00-68; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==VARs==&lt;br /&gt;
Noteable variables for persistent storage of some replication control data within a slave&#039;s VARs section.&lt;br /&gt;
;LDAP Replication, remote highest USN:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/u-r/cn=PBX0 p 102&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/u-r/cn=KBX0 p 105&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;LDAP Replication, remote last seen epoch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/epoc-r/cn=KPBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/epoc-r/cn=PBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Restore on Master==&lt;br /&gt;
A mechanism provides information by a replication master to replication slaves that a full replication run shall take place. That mechanism gets triggered by an upload of a configuration to a master. A restore of an older configuration on a master causes a new GUID for the object with the name &#039;&#039;_ADMIN_&#039;&#039;.&lt;br /&gt;
*A new configuration is going to be uploaded&lt;br /&gt;
*The Flash Directory processes the module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 erase-all&amp;lt;/pre&amp;gt;&lt;br /&gt;
**The FLASH Directory erases it&#039;s entire database, awaiting further commands&lt;br /&gt;
*The FLASH Directory processes a module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 add-item 102 (cn=_ADMIN_)..(guid;bin=5238705224C067016FD10090334117BE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
**This is the Admin object. Before being stored, it will now get assigned a new random GUID&lt;br /&gt;
*The Admin object&#039;s new GUID gets now promoted as the new &#039;&#039;epoch&#039;&#039; for the master&#039;s database. Replication slave&#039;s are supposed to detect a change of the DB&#039;s epoch and to replicate in full.&lt;br /&gt;
&lt;br /&gt;
==Detecting Obsolete Objects==&lt;br /&gt;
Objects with the isDeleted attribute, a.k.a. tombstones, shall persist ideally forever. In practice tombstones get erased after a timeout. Only the most recent tombstone (tombstone with highest USN) remains.&lt;br /&gt;
;Current tombstone timeout: 48 hours&lt;br /&gt;
===Behaviour during Full Replication===&lt;br /&gt;
The local phase takes place in full. The replicator pages over all local objects and compares them with the master to see if they are still present.&lt;br /&gt;
===Behaviour during Incremental Replication===&lt;br /&gt;
The local phase is completely eliminated, respectively skipped.&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75774</id>
		<title>Reference16r1:Concept LDAP Replication</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75774"/>
		<updated>2025-03-18T08:36:19Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Algorithmic and Technical Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;LDAP replication concepts, mainly the differences between full- and incremental replication are going to be covered within  this article. The focus is on replication between PBXs. &lt;br /&gt;
= Glossary =&lt;br /&gt;
;Admin Object: An LDAP DB object named &amp;quot;_ADMIN_&amp;quot;.&lt;br /&gt;
;Config Restore: The act of administratively uploading an old configuration to a box. Can be accomplished via the firmware&#039;s maintenance UI or in-part via a PBX UI.&lt;br /&gt;
;Epoch: A Root DSE value. The current value of the GUID of the object Admin object. &lt;br /&gt;
;Flashdir, Flashman: Flash Directory, Flash Manager with Flashdir sitting on-top of Flashman. The Flashdir exchange API messages with the Flashman to persistently add, replace, delete LDAP objects. &lt;br /&gt;
;Full Replication: Every object is going to be queried and or handled by replication partners.&lt;br /&gt;
;GUID: A unique 16-byte value. Every object contains an attribute GUID.&lt;br /&gt;
;Incremental Replication: Only objects written since a last-known point in time will be queried and or handled.&lt;br /&gt;
;Master: The replication partner acting as an LDAP server.&lt;br /&gt;
;Notify Search: A single LDAP search remaing active until a cancellation. A server responds to it with multiple search responses for all objects being modified after the notify search was received.&lt;br /&gt;
;Paged Search/Paging: A means to iterate over an entire database in chunks or pages of a fixed maximum size.&lt;br /&gt;
;Replication Filter: A static LDAP filter supposed to be active during a replication session. &lt;br /&gt;
;Root DSE: Directory-specific entry. A collection of few properties and capabilities that can be read by any LDAP client. The Root DSE is accessible without authentication and by providing a special search filter.&lt;br /&gt;
;Slave: The replication partner acting as an LDAP client.&lt;br /&gt;
;Tombstones, isDeleted: Deleted objects aren&#039;t deleted immediately from storage. Instead, such objects are marked with an attribute isDeleted.&lt;br /&gt;
;USN: Update Sequence Number, a 64-bit value incremented by 1 on every write. It is deemed to never wrap-around and to be unique within an LDAP DB. Every object contains an attribute USN.&lt;br /&gt;
&lt;br /&gt;
= Technical concept of replication as client =&lt;br /&gt;
The replication of a source via LDAP is basically divided into 3 phases that must be passed through when synchronization is started.&lt;br /&gt;
 &lt;br /&gt;
;1st phase &#039;&#039;local&#039;&#039;&lt;br /&gt;
The first phase is the &amp;quot;local&amp;quot; phase and ensures a comparison of any delta between the local data stock and the remote data stock. (In other words, objects that need to be deleted locally).&lt;br /&gt;
&lt;br /&gt;
The LDAP client makes an LDAP query per local object (which it knows from its local database) based on the &#039;&#039;guid&#039;&#039; to the LDAP server. If the LDAP server knows this object, it returns the entire object so that the client can update the object locally if necessary. If the object does not exist in the LDAP server, it is removed locally.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status shows the following:&lt;br /&gt;
 remote: Stopped&lt;br /&gt;
 local: Active&lt;br /&gt;
&lt;br /&gt;
;2nd phase &#039;&#039;remote&#039;&#039;&lt;br /&gt;
The second phase is the &amp;quot;remote&amp;quot; phase and ensures a comparison of any delta between the remote data stock and the local data stock. (In other words, objects that are missing locally are created).&lt;br /&gt;
&lt;br /&gt;
The LDAP client requests a paging version of all objects of the LDAP server. The client then receives back page by page (2 objects) per request. If necessary, objects in the local database are updated accordingly.&lt;br /&gt;
&lt;br /&gt;
During this phase the following is shown in the status:&lt;br /&gt;
 remote: Active&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
;3rd phase &#039;&#039;notify&#039;&#039;&lt;br /&gt;
The third phase is the &amp;quot;notify&amp;quot; phase, in which there is no longer an open delta between the two sources, and future changes are synchronised.&lt;br /&gt;
In this phase, a permanent TCP connection exists between the LDAP client and the LDAP server and is used for the LDAP server to notify the LDAP client when a change has occurred so that the client can create or update the record in the local database.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status will show the following:&lt;br /&gt;
 remote: Completed&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
It is important to note that:&lt;br /&gt;
* if a problem occurs (e.g. due to the interruption of a phase or e.g. loss of the TCP connection to the LDAP server) the synchronisation starts again from the first phase (&amp;quot;local&amp;quot;)&lt;br /&gt;
* the local attribute &#039;&#039;usn&#039;&#039; will not be replicated. Each ldap node manages its own local &#039;&#039;usn&#039;&#039;&lt;br /&gt;
* if you use a configured [[{{NAMESPACE}}:Services/LDAP/Replicator|&#039;&#039;Poll Timer&#039;&#039;]] the notify feature will not be used in this ldap session&lt;br /&gt;
&lt;br /&gt;
=Algorithmic and Technical Details=&lt;br /&gt;
This section covers details the incremental replication is based on, enabling the transition from full- to incremental replication and back from incremental- to full replication.&lt;br /&gt;
==epoch==&lt;br /&gt;
The master&#039;s Root DSE contains or does not contain an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;, reflecting the GUID attribute of an existing object by the name &#039;&#039;&#039;_admin_&#039;&#039;&#039;. A slave must permanently store the epoch as a persistent VARiable &#039;&#039;&#039;epoch&#039;&#039;&#039;.&lt;br /&gt;
*Slave connects and BINDs to master&lt;br /&gt;
*Slave requests Root DSE from master&lt;br /&gt;
*Slave evalutates &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is not present&lt;br /&gt;
***=&amp;gt;Full replication&lt;br /&gt;
***Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is present&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; matches slave&#039;s copy&lt;br /&gt;
****=&amp;gt;Incremental replication&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; does not match slave&#039;s copy&lt;br /&gt;
****Delete copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
****=&amp;gt;Full replication&lt;br /&gt;
****Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
*Slave, persistent &#039;&#039;epoch&#039;&#039; storage&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/epoc-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==USN Processing==&lt;br /&gt;
Every object features the attribute &#039;&#039;&#039;USN&#039;&#039;&#039;. A slave keeps track of the highest USN seen within all objects rx&#039;ed from a master. &lt;br /&gt;
*Slave checks USN for objects rx&#039;ed from master&lt;br /&gt;
**No local record of a highest USN&lt;br /&gt;
***=&amp;gt;Store current USN as highest USN&lt;br /&gt;
**Local copy of highest USN existing&lt;br /&gt;
***RX&#039;ed USN greater than local USN copy&lt;br /&gt;
****=&amp;gt;Store current USN as highest USN&lt;br /&gt;
***RX&#039;ed USN less or equal than local USN copy&lt;br /&gt;
****=&amp;gt;NOP, nothing to be done&lt;br /&gt;
&lt;br /&gt;
*Slave, persistent USN storage&lt;br /&gt;
**Replication completed - at the end of a full or incremental replication. Also, when rx&#039;ing notify search results from a master.&lt;br /&gt;
***=&amp;gt;Persistently storing the volatile memorized highest USN&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/u-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Paging==&lt;br /&gt;
Incremental paging requires an additional filter term spedifying a USN value. &lt;br /&gt;
*1st Search&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (&amp;amp;(objectclass=*)&#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039;) The USN-Term contains the highest USN rx&#039;ed during last replication run, plus 1.&lt;br /&gt;
***Cookie &amp;lt;empty&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate &#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039; and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
*2nd Search,..&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (objectclass=*)&lt;br /&gt;
***Cookie &amp;lt;Last Cookie content rx&#039;ed from server&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate cookie and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
==Root DSE==&lt;br /&gt;
Because of the Flash Directory also exporting some infos into the Root DSE it probably makes sense to inform there about the current GUID of the &#039;&#039;_admin_&#039;&#039; object. Following excerpt represents this by an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;. A slave can comfortably compare this to its copy of the epoch last seen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Getting 1 entries:&lt;br /&gt;
&amp;gt;&amp;gt; Dn: &lt;br /&gt;
	1&amp;gt; epoch: 0B1581AF783F67018F170050568214B4; &lt;br /&gt;
..&lt;br /&gt;
	1&amp;gt; ldapServiceName: IP6013-50-00-68; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==VARs==&lt;br /&gt;
Noteable variables for persistent storage of some replication control data within a slave&#039;s VARs section.&lt;br /&gt;
;LDAP Replication, remote highest USN:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/u-r/cn=PBX0 p 102&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/u-r/cn=KBX0 p 105&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;LDAP Replication, remote last seen epoch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/epoc-r/cn=KPBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/epoc-r/cn=PBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Restore on Master==&lt;br /&gt;
A restore of an older configuration on a master causes a new GUID for the object with the name &#039;&#039;_ADMIN_&#039;&#039;.&lt;br /&gt;
*A new configuration is going to be uploaded&lt;br /&gt;
*The Flash Directory processes the module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 erase-all&amp;lt;/pre&amp;gt;&lt;br /&gt;
**The FLASH Directory erases it&#039;s entire database, awaiting further commands&lt;br /&gt;
*The FLASH Directory processes a module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 add-item 102 (cn=_ADMIN_)..(guid;bin=5238705224C067016FD10090334117BE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
**This is the Admin object. Before being stored, it will now get assigned a new random GUID&lt;br /&gt;
*The Admin object&#039;s new GUID gets now promoted as the new &#039;&#039;epoch&#039;&#039; for the master&#039;s database&lt;br /&gt;
&lt;br /&gt;
==Detecting Obsolete Objects==&lt;br /&gt;
Objects with the isDeleted attribute, a.k.a. tombstones, shall persist ideally forever. In practice tombstones get erased after a timeout. Only the most recent tombstone (tombstone with highest USN) remains.&lt;br /&gt;
;Current tombstone timeout: 48 hours&lt;br /&gt;
===Behaviour during Full Replication===&lt;br /&gt;
The local phase takes place in full. The replicator pages over all local objects and compares them with the master to see if they are still present.&lt;br /&gt;
===Behaviour during Incremental Replication===&lt;br /&gt;
The local phase is completely eliminated, respectively skipped.&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75773</id>
		<title>Reference16r1:Concept LDAP Replication</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75773"/>
		<updated>2025-03-18T08:33:16Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: Emphasized PBX replication: &amp;quot;The focus is on replication between PBXs.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;LDAP replication concepts, mainly the differences between full- and incremental replication are going to be covered within  this article. The focus is on replication between PBXs. &lt;br /&gt;
= Glossary =&lt;br /&gt;
;Admin Object: An LDAP DB object named &amp;quot;_ADMIN_&amp;quot;.&lt;br /&gt;
;Config Restore: The act of administratively uploading an old configuration to a box. Can be accomplished via the firmware&#039;s maintenance UI or in-part via a PBX UI.&lt;br /&gt;
;Epoch: A Root DSE value. The current value of the GUID of the object Admin object. &lt;br /&gt;
;Flashdir, Flashman: Flash Directory, Flash Manager with Flashdir sitting on-top of Flashman. The Flashdir exchange API messages with the Flashman to persistently add, replace, delete LDAP objects. &lt;br /&gt;
;Full Replication: Every object is going to be queried and or handled by replication partners.&lt;br /&gt;
;GUID: A unique 16-byte value. Every object contains an attribute GUID.&lt;br /&gt;
;Incremental Replication: Only objects written since a last-known point in time will be queried and or handled.&lt;br /&gt;
;Master: The replication partner acting as an LDAP server.&lt;br /&gt;
;Notify Search: A single LDAP search remaing active until a cancellation. A server responds to it with multiple search responses for all objects being modified after the notify search was received.&lt;br /&gt;
;Paged Search/Paging: A means to iterate over an entire database in chunks or pages of a fixed maximum size.&lt;br /&gt;
;Replication Filter: A static LDAP filter supposed to be active during a replication session. &lt;br /&gt;
;Root DSE: Directory-specific entry. A collection of few properties and capabilities that can be read by any LDAP client. The Root DSE is accessible without authentication and by providing a special search filter.&lt;br /&gt;
;Slave: The replication partner acting as an LDAP client.&lt;br /&gt;
;Tombstones, isDeleted: Deleted objects aren&#039;t deleted immediately from storage. Instead, such objects are marked with an attribute isDeleted.&lt;br /&gt;
;USN: Update Sequence Number, a 64-bit value incremented by 1 on every write. It is deemed to never wrap-around and to be unique within an LDAP DB. Every object contains an attribute USN.&lt;br /&gt;
&lt;br /&gt;
= Technical concept of replication as client =&lt;br /&gt;
The replication of a source via LDAP is basically divided into 3 phases that must be passed through when synchronization is started.&lt;br /&gt;
 &lt;br /&gt;
;1st phase &#039;&#039;local&#039;&#039;&lt;br /&gt;
The first phase is the &amp;quot;local&amp;quot; phase and ensures a comparison of any delta between the local data stock and the remote data stock. (In other words, objects that need to be deleted locally).&lt;br /&gt;
&lt;br /&gt;
The LDAP client makes an LDAP query per local object (which it knows from its local database) based on the &#039;&#039;guid&#039;&#039; to the LDAP server. If the LDAP server knows this object, it returns the entire object so that the client can update the object locally if necessary. If the object does not exist in the LDAP server, it is removed locally.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status shows the following:&lt;br /&gt;
 remote: Stopped&lt;br /&gt;
 local: Active&lt;br /&gt;
&lt;br /&gt;
;2nd phase &#039;&#039;remote&#039;&#039;&lt;br /&gt;
The second phase is the &amp;quot;remote&amp;quot; phase and ensures a comparison of any delta between the remote data stock and the local data stock. (In other words, objects that are missing locally are created).&lt;br /&gt;
&lt;br /&gt;
The LDAP client requests a paging version of all objects of the LDAP server. The client then receives back page by page (2 objects) per request. If necessary, objects in the local database are updated accordingly.&lt;br /&gt;
&lt;br /&gt;
During this phase the following is shown in the status:&lt;br /&gt;
 remote: Active&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
;3rd phase &#039;&#039;notify&#039;&#039;&lt;br /&gt;
The third phase is the &amp;quot;notify&amp;quot; phase, in which there is no longer an open delta between the two sources, and future changes are synchronised.&lt;br /&gt;
In this phase, a permanent TCP connection exists between the LDAP client and the LDAP server and is used for the LDAP server to notify the LDAP client when a change has occurred so that the client can create or update the record in the local database.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status will show the following:&lt;br /&gt;
 remote: Completed&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
It is important to note that:&lt;br /&gt;
* if a problem occurs (e.g. due to the interruption of a phase or e.g. loss of the TCP connection to the LDAP server) the synchronisation starts again from the first phase (&amp;quot;local&amp;quot;)&lt;br /&gt;
* the local attribute &#039;&#039;usn&#039;&#039; will not be replicated. Each ldap node manages its own local &#039;&#039;usn&#039;&#039;&lt;br /&gt;
* if you use a configured [[{{NAMESPACE}}:Services/LDAP/Replicator|&#039;&#039;Poll Timer&#039;&#039;]] the notify feature will not be used in this ldap session&lt;br /&gt;
&lt;br /&gt;
=Algorithmic and Technical Details=&lt;br /&gt;
This section covers details the incremental replication is based on, enabling the transition from full- to incremental replication.&lt;br /&gt;
==epoch==&lt;br /&gt;
The master&#039;s Root DSE contains or does not contain an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;, reflecting the GUID attribute of an existing object by the name &#039;&#039;&#039;_admin_&#039;&#039;&#039;. A slave must permanently store the epoch as a persistent VARiable &#039;&#039;&#039;epoch&#039;&#039;&#039;.&lt;br /&gt;
*Slave connects and BINDs to master&lt;br /&gt;
*Slave requests Root DSE from master&lt;br /&gt;
*Slave evalutates &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is not present&lt;br /&gt;
***=&amp;gt;Full replication&lt;br /&gt;
***Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is present&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; matches slave&#039;s copy&lt;br /&gt;
****=&amp;gt;Incremental replication&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; does not match slave&#039;s copy&lt;br /&gt;
****Delete copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
****=&amp;gt;Full replication&lt;br /&gt;
****Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
*Slave, persistent &#039;&#039;epoch&#039;&#039; storage&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/epoc-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==USN Processing==&lt;br /&gt;
Every object features the attribute &#039;&#039;&#039;USN&#039;&#039;&#039;. A slave keeps track of the highest USN seen within all objects rx&#039;ed from a master. &lt;br /&gt;
*Slave checks USN for objects rx&#039;ed from master&lt;br /&gt;
**No local record of a highest USN&lt;br /&gt;
***=&amp;gt;Store current USN as highest USN&lt;br /&gt;
**Local copy of highest USN existing&lt;br /&gt;
***RX&#039;ed USN greater than local USN copy&lt;br /&gt;
****=&amp;gt;Store current USN as highest USN&lt;br /&gt;
***RX&#039;ed USN less or equal than local USN copy&lt;br /&gt;
****=&amp;gt;NOP, nothing to be done&lt;br /&gt;
&lt;br /&gt;
*Slave, persistent USN storage&lt;br /&gt;
**Replication completed - at the end of a full or incremental replication. Also, when rx&#039;ing notify search results from a master.&lt;br /&gt;
***=&amp;gt;Persistently storing the volatile memorized highest USN&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/u-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Paging==&lt;br /&gt;
Incremental paging requires an additional filter term spedifying a USN value. &lt;br /&gt;
*1st Search&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (&amp;amp;(objectclass=*)&#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039;) The USN-Term contains the highest USN rx&#039;ed during last replication run, plus 1.&lt;br /&gt;
***Cookie &amp;lt;empty&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate &#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039; and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
*2nd Search,..&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (objectclass=*)&lt;br /&gt;
***Cookie &amp;lt;Last Cookie content rx&#039;ed from server&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate cookie and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
==Root DSE==&lt;br /&gt;
Because of the Flash Directory also exporting some infos into the Root DSE it probably makes sense to inform there about the current GUID of the &#039;&#039;_admin_&#039;&#039; object. Following excerpt represents this by an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;. A slave can comfortably compare this to its copy of the epoch last seen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Getting 1 entries:&lt;br /&gt;
&amp;gt;&amp;gt; Dn: &lt;br /&gt;
	1&amp;gt; epoch: 0B1581AF783F67018F170050568214B4; &lt;br /&gt;
..&lt;br /&gt;
	1&amp;gt; ldapServiceName: IP6013-50-00-68; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==VARs==&lt;br /&gt;
Noteable variables for persistent storage of some replication control data within a slave&#039;s VARs section.&lt;br /&gt;
;LDAP Replication, remote highest USN:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/u-r/cn=PBX0 p 102&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/u-r/cn=KBX0 p 105&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;LDAP Replication, remote last seen epoch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/epoc-r/cn=KPBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/epoc-r/cn=PBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Restore on Master==&lt;br /&gt;
A restore of an older configuration on a master causes a new GUID for the object with the name &#039;&#039;_ADMIN_&#039;&#039;.&lt;br /&gt;
*A new configuration is going to be uploaded&lt;br /&gt;
*The Flash Directory processes the module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 erase-all&amp;lt;/pre&amp;gt;&lt;br /&gt;
**The FLASH Directory erases it&#039;s entire database, awaiting further commands&lt;br /&gt;
*The FLASH Directory processes a module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 add-item 102 (cn=_ADMIN_)..(guid;bin=5238705224C067016FD10090334117BE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
**This is the Admin object. Before being stored, it will now get assigned a new random GUID&lt;br /&gt;
*The Admin object&#039;s new GUID gets now promoted as the new &#039;&#039;epoch&#039;&#039; for the master&#039;s database&lt;br /&gt;
&lt;br /&gt;
==Detecting Obsolete Objects==&lt;br /&gt;
Objects with the isDeleted attribute, a.k.a. tombstones, shall persist ideally forever. In practice tombstones get erased after a timeout. Only the most recent tombstone (tombstone with highest USN) remains.&lt;br /&gt;
;Current tombstone timeout: 48 hours&lt;br /&gt;
===Behaviour during Full Replication===&lt;br /&gt;
The local phase takes place in full. The replicator pages over all local objects and compares them with the master to see if they are still present.&lt;br /&gt;
===Behaviour during Incremental Replication===&lt;br /&gt;
The local phase is completely eliminated, respectively skipped.&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Services/LDAP/Rep-Status&amp;diff=75772</id>
		<title>Reference15r1:Services/LDAP/Rep-Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Services/LDAP/Rep-Status&amp;diff=75772"/>
		<updated>2025-03-18T08:28:27Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: Added status local/paged. Added replication type &amp;quot;Incremental&amp;quot;. Added overall state &amp;quot;Completed&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The displayed &#039;&#039;&#039;replicator status&#039;&#039;&#039; data is automatically updated in 2 second intervals. In addition, the last ten activity messages of the replication are displayed below.&lt;br /&gt;
&lt;br /&gt;
== Status overview ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server:&#039;&#039;&#039; IP-address and port of the remote LDAP server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Full/Incremental Replication:&#039;&#039;&#039; Current state of the replication. The states are: &#039;&#039;Stop&#039;&#039;, &#039;&#039;Starting&#039;&#039;, &#039;&#039;Up&#039;&#039;, &#039;&#039;Down, Completed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;remote:&#039;&#039;&#039; Displays the state of the replication in poll direction.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;notify:&#039;&#039;&#039; Number of received notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;modify:&#039;&#039;&#039; Number of modified objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;paged:&#039;&#039;&#039; Number of objects received from remote directory server in response to paged-search requests.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no match:&#039;&#039;&#039; (AD-Only) Number of objects received and not matching the LDAP filter condition entered under Configuration/LDAP/Replicator.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;discarded:&#039;&#039;&#039; (AD-Only) Number of objects discarded, because there was no suitable MAP found.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;local:&#039;&#039;&#039; Displays the state of the replication in push direction.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;add:&#039;&#039;&#039; Number of locally added objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;del:&#039;&#039;&#039; Number of locally deleted objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;paged:&#039;&#039;&#039; Number of objects received from local flash directory in response to paged-search requests.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;modify:&#039;&#039;&#039; Number of locally modified objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;notify:&#039;&#039;&#039; Number of notifications that have arisen locally.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pending:&#039;&#039;&#039; Number of locally waiting objects.&lt;br /&gt;
&lt;br /&gt;
=Related Articles=&lt;br /&gt;
* [[{{NAMESPACE}}:Concept LDAP Replication]]&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75768</id>
		<title>Reference16r1:Concept LDAP Replication</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75768"/>
		<updated>2025-03-17T14:26:18Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Glossary */ condensed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;LDAP replication concepts, mainly the differences between full- and incremental replication are going to be covered within  this article. &lt;br /&gt;
= Glossary =&lt;br /&gt;
;Admin Object: An LDAP DB object named &amp;quot;_ADMIN_&amp;quot;.&lt;br /&gt;
;Config Restore: The act of administratively uploading an old configuration to a box. Can be accomplished via the firmware&#039;s maintenance UI or in-part via a PBX UI.&lt;br /&gt;
;Epoch: A Root DSE value. The current value of the GUID of the object Admin object. &lt;br /&gt;
;Flashdir, Flashman: Flash Directory, Flash Manager with Flashdir sitting on-top of Flashman. The Flashdir exchange API messages with the Flashman to persistently add, replace, delete LDAP objects. &lt;br /&gt;
;Full Replication: Every object is going to be queried and or handled by replication partners.&lt;br /&gt;
;GUID: A unique 16-byte value. Every object contains an attribute GUID.&lt;br /&gt;
;Incremental Replication: Only objects written since a last-known point in time will be queried and or handled.&lt;br /&gt;
;Master: The replication partner acting as an LDAP server.&lt;br /&gt;
;Notify Search: A single LDAP search remaing active until a cancellation. A server responds to it with multiple search responses for all objects being modified after the notify search was received.&lt;br /&gt;
;Paged Search/Paging: A means to iterate over an entire database in chunks or pages of a fixed maximum size.&lt;br /&gt;
;Replication Filter: A static LDAP filter supposed to be active during a replication session. &lt;br /&gt;
;Root DSE: Directory-specific entry. A collection of few properties and capabilities that can be read by any LDAP client. The Root DSE is accessible without authentication and by providing a special search filter.&lt;br /&gt;
;Slave: The replication partner acting as an LDAP client.&lt;br /&gt;
;Tombstones, isDeleted: Deleted objects aren&#039;t deleted immediately from storage. Instead, such objects are marked with an attribute isDeleted.&lt;br /&gt;
;USN: Update Sequence Number, a 64-bit value incremented by 1 on every write. It is deemed to never wrap-around and to be unique within an LDAP DB. Every object contains an attribute USN.&lt;br /&gt;
&lt;br /&gt;
= Technical concept of replication as client =&lt;br /&gt;
The replication of a source via LDAP is basically divided into 3 phases that must be passed through when synchronization is started.&lt;br /&gt;
 &lt;br /&gt;
;1st phase &#039;&#039;local&#039;&#039;&lt;br /&gt;
The first phase is the &amp;quot;local&amp;quot; phase and ensures a comparison of any delta between the local data stock and the remote data stock. (In other words, objects that need to be deleted locally).&lt;br /&gt;
&lt;br /&gt;
The LDAP client makes an LDAP query per local object (which it knows from its local database) based on the &#039;&#039;guid&#039;&#039; to the LDAP server. If the LDAP server knows this object, it returns the entire object so that the client can update the object locally if necessary. If the object does not exist in the LDAP server, it is removed locally.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status shows the following:&lt;br /&gt;
 remote: Stopped&lt;br /&gt;
 local: Active&lt;br /&gt;
&lt;br /&gt;
;2nd phase &#039;&#039;remote&#039;&#039;&lt;br /&gt;
The second phase is the &amp;quot;remote&amp;quot; phase and ensures a comparison of any delta between the remote data stock and the local data stock. (In other words, objects that are missing locally are created).&lt;br /&gt;
&lt;br /&gt;
The LDAP client requests a paging version of all objects of the LDAP server. The client then receives back page by page (2 objects) per request. If necessary, objects in the local database are updated accordingly.&lt;br /&gt;
&lt;br /&gt;
During this phase the following is shown in the status:&lt;br /&gt;
 remote: Active&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
;3rd phase &#039;&#039;notify&#039;&#039;&lt;br /&gt;
The third phase is the &amp;quot;notify&amp;quot; phase, in which there is no longer an open delta between the two sources, and future changes are synchronised.&lt;br /&gt;
In this phase, a permanent TCP connection exists between the LDAP client and the LDAP server and is used for the LDAP server to notify the LDAP client when a change has occurred so that the client can create or update the record in the local database.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status will show the following:&lt;br /&gt;
 remote: Completed&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
It is important to note that:&lt;br /&gt;
* if a problem occurs (e.g. due to the interruption of a phase or e.g. loss of the TCP connection to the LDAP server) the synchronisation starts again from the first phase (&amp;quot;local&amp;quot;)&lt;br /&gt;
* the local attribute &#039;&#039;usn&#039;&#039; will not be replicated. Each ldap node manages its own local &#039;&#039;usn&#039;&#039;&lt;br /&gt;
* if you use a configured [[{{NAMESPACE}}:Services/LDAP/Replicator|&#039;&#039;Poll Timer&#039;&#039;]] the notify feature will not be used in this ldap session&lt;br /&gt;
&lt;br /&gt;
=Algorithmic and Technical Details=&lt;br /&gt;
This section covers details the incremental replication is based on, enabling the transition from full- to incremental replication.&lt;br /&gt;
==epoch==&lt;br /&gt;
The master&#039;s Root DSE contains or does not contain an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;, reflecting the GUID attribute of an existing object by the name &#039;&#039;&#039;_admin_&#039;&#039;&#039;. A slave must permanently store the epoch as a persistent VARiable &#039;&#039;&#039;epoch&#039;&#039;&#039;.&lt;br /&gt;
*Slave connects and BINDs to master&lt;br /&gt;
*Slave requests Root DSE from master&lt;br /&gt;
*Slave evalutates &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is not present&lt;br /&gt;
***=&amp;gt;Full replication&lt;br /&gt;
***Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is present&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; matches slave&#039;s copy&lt;br /&gt;
****=&amp;gt;Incremental replication&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; does not match slave&#039;s copy&lt;br /&gt;
****Delete copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
****=&amp;gt;Full replication&lt;br /&gt;
****Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
*Slave, persistent &#039;&#039;epoch&#039;&#039; storage&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/epoc-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==USN Processing==&lt;br /&gt;
Every object features the attribute &#039;&#039;&#039;USN&#039;&#039;&#039;. A slave keeps track of the highest USN seen within all objects rx&#039;ed from a master. &lt;br /&gt;
*Slave checks USN for objects rx&#039;ed from master&lt;br /&gt;
**No local record of a highest USN&lt;br /&gt;
***=&amp;gt;Store current USN as highest USN&lt;br /&gt;
**Local copy of highest USN existing&lt;br /&gt;
***RX&#039;ed USN greater than local USN copy&lt;br /&gt;
****=&amp;gt;Store current USN as highest USN&lt;br /&gt;
***RX&#039;ed USN less or equal than local USN copy&lt;br /&gt;
****=&amp;gt;NOP, nothing to be done&lt;br /&gt;
&lt;br /&gt;
*Slave, persistent USN storage&lt;br /&gt;
**Replication completed - at the end of a full or incremental replication. Also, when rx&#039;ing notify search results from a master.&lt;br /&gt;
***=&amp;gt;Persistently storing the volatile memorized highest USN&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/u-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Paging==&lt;br /&gt;
Incremental paging requires an additional filter term spedifying a USN value. &lt;br /&gt;
*1st Search&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (&amp;amp;(objectclass=*)&#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039;) The USN-Term contains the highest USN rx&#039;ed during last replication run, plus 1.&lt;br /&gt;
***Cookie &amp;lt;empty&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate &#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039; and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
*2nd Search,..&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (objectclass=*)&lt;br /&gt;
***Cookie &amp;lt;Last Cookie content rx&#039;ed from server&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate cookie and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
==Root DSE==&lt;br /&gt;
Because of the Flash Directory also exporting some infos into the Root DSE it probably makes sense to inform there about the current GUID of the &#039;&#039;_admin_&#039;&#039; object. Following excerpt represents this by an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;. A slave can comfortably compare this to its copy of the epoch last seen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Getting 1 entries:&lt;br /&gt;
&amp;gt;&amp;gt; Dn: &lt;br /&gt;
	1&amp;gt; epoch: 0B1581AF783F67018F170050568214B4; &lt;br /&gt;
..&lt;br /&gt;
	1&amp;gt; ldapServiceName: IP6013-50-00-68; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==VARs==&lt;br /&gt;
Noteable variables for persistent storage of some replication control data within a slave&#039;s VARs section.&lt;br /&gt;
;LDAP Replication, remote highest USN:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/u-r/cn=PBX0 p 102&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/u-r/cn=KBX0 p 105&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;LDAP Replication, remote last seen epoch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/epoc-r/cn=KPBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/epoc-r/cn=PBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Restore on Master==&lt;br /&gt;
A restore of an older configuration on a master causes a new GUID for the object with the name &#039;&#039;_ADMIN_&#039;&#039;.&lt;br /&gt;
*A new configuration is going to be uploaded&lt;br /&gt;
*The Flash Directory processes the module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 erase-all&amp;lt;/pre&amp;gt;&lt;br /&gt;
**The FLASH Directory erases it&#039;s entire database, awaiting further commands&lt;br /&gt;
*The FLASH Directory processes a module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 add-item 102 (cn=_ADMIN_)..(guid;bin=5238705224C067016FD10090334117BE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
**This is the Admin object. Before being stored, it will now get assigned a new random GUID&lt;br /&gt;
*The Admin object&#039;s new GUID gets now promoted as the new &#039;&#039;epoch&#039;&#039; for the master&#039;s database&lt;br /&gt;
&lt;br /&gt;
==Detecting Obsolete Objects==&lt;br /&gt;
Objects with the isDeleted attribute, a.k.a. tombstones, shall persist ideally forever. In practice tombstones get erased after a timeout. Only the most recent tombstone (tombstone with highest USN) remains.&lt;br /&gt;
;Current tombstone timeout: 48 hours&lt;br /&gt;
===Behaviour during Full Replication===&lt;br /&gt;
The local phase takes place in full. The replicator pages over all local objects and compares them with the master to see if they are still present.&lt;br /&gt;
===Behaviour during Incremental Replication===&lt;br /&gt;
The local phase is completely eliminated, respectively skipped.&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75767</id>
		<title>Reference16r1:Concept LDAP Replication</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_LDAP_Replication&amp;diff=75767"/>
		<updated>2025-03-17T14:19:47Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: Merged aspects of incremental replication from the design document for the incremental replication&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;LDAP replication concepts, mainly the differences between full- and incremental replication are going to be covered within  this article. &lt;br /&gt;
= Glossary =&lt;br /&gt;
;Admin Object: An LDAP DB object named &amp;quot;_ADMIN_&amp;quot;.&lt;br /&gt;
;Attribute &amp;quot;phys&amp;quot;: LDAP attribute reflecting where an (H.323/Sip) client is currently registered. &lt;br /&gt;
;Attribute &amp;quot;rep&amp;quot;: LDAP attribute playing a role - TO BE DETAILED - within an replication filter.&lt;br /&gt;
;Config Restore: The act of administratively uploading an old configuration to a box. Can be accomplished via the firmware&#039;s maintenance UI or in-part via a PBX UI.&lt;br /&gt;
;Epoch: A Root DSE value. The current value of the GUID of the object Admin object. &lt;br /&gt;
;Flashdir, Flashman: Flash Directory, Flash Manager with Flashdir sitting on-top of Flashman. The Flashdir exchange API messages with the Flashman to persistently add, replace, delete LDAP objects. &lt;br /&gt;
;Full Replication: Every object is going to be queried and or handled by replication partners.&lt;br /&gt;
;GUID: A unique 16-byte value. Every object contains an attribute GUID.&lt;br /&gt;
;highestCommitedUSN: A Root DSE value. The current value of the highest USN among all objects within a directory&#039;s database.&lt;br /&gt;
;Incremental Replication: Only objects written since a last-known point in time will be queried and or handled.&lt;br /&gt;
;Master: The replication partner acting as an LDAP server.&lt;br /&gt;
;Notify Search: A single LDAP search remaing active until a cancellation. A server responds to it with multiple search responses for all objects being modified after the notify search was received.&lt;br /&gt;
;Paged Search/Paging: A means to iterate over an entire database in chunks or pages of a fixed maximum size.&lt;br /&gt;
;Replication Filter: A static LDAP filter supposed to be active during a replication session. &lt;br /&gt;
;Root DSE: Directory-specific entry. A collection of few properties and capabilities that can be read by any LDAP client. The Root DSE is accessible without authentication and by providing a special search filter.&lt;br /&gt;
;Slave: The replication partner acting as an LDAP client.&lt;br /&gt;
;Tombstones, isDeleted: Deleted objects aren&#039;t deleted immediately from storage. Instead, such objects are marked with an attribute isDeleted.&lt;br /&gt;
;USN: Update Sequence Number, a 64-bit value incremented by 1 on every write. It is deemed to never wrap-around and to be unique within an LDAP DB. Every object contains an attribute USN.&lt;br /&gt;
&lt;br /&gt;
= Technical concept of replication as client =&lt;br /&gt;
The replication of a source via LDAP is basically divided into 3 phases that must be passed through when synchronization is started.&lt;br /&gt;
 &lt;br /&gt;
;1st phase &#039;&#039;local&#039;&#039;&lt;br /&gt;
The first phase is the &amp;quot;local&amp;quot; phase and ensures a comparison of any delta between the local data stock and the remote data stock. (In other words, objects that need to be deleted locally).&lt;br /&gt;
&lt;br /&gt;
The LDAP client makes an LDAP query per local object (which it knows from its local database) based on the &#039;&#039;guid&#039;&#039; to the LDAP server. If the LDAP server knows this object, it returns the entire object so that the client can update the object locally if necessary. If the object does not exist in the LDAP server, it is removed locally.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status shows the following:&lt;br /&gt;
 remote: Stopped&lt;br /&gt;
 local: Active&lt;br /&gt;
&lt;br /&gt;
;2nd phase &#039;&#039;remote&#039;&#039;&lt;br /&gt;
The second phase is the &amp;quot;remote&amp;quot; phase and ensures a comparison of any delta between the remote data stock and the local data stock. (In other words, objects that are missing locally are created).&lt;br /&gt;
&lt;br /&gt;
The LDAP client requests a paging version of all objects of the LDAP server. The client then receives back page by page (2 objects) per request. If necessary, objects in the local database are updated accordingly.&lt;br /&gt;
&lt;br /&gt;
During this phase the following is shown in the status:&lt;br /&gt;
 remote: Active&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
;3rd phase &#039;&#039;notify&#039;&#039;&lt;br /&gt;
The third phase is the &amp;quot;notify&amp;quot; phase, in which there is no longer an open delta between the two sources, and future changes are synchronised.&lt;br /&gt;
In this phase, a permanent TCP connection exists between the LDAP client and the LDAP server and is used for the LDAP server to notify the LDAP client when a change has occurred so that the client can create or update the record in the local database.&lt;br /&gt;
&lt;br /&gt;
During this phase, the status will show the following:&lt;br /&gt;
 remote: Completed&lt;br /&gt;
 local: Completed&lt;br /&gt;
&lt;br /&gt;
It is important to note that:&lt;br /&gt;
* if a problem occurs (e.g. due to the interruption of a phase or e.g. loss of the TCP connection to the LDAP server) the synchronisation starts again from the first phase (&amp;quot;local&amp;quot;)&lt;br /&gt;
* the local attribute &#039;&#039;usn&#039;&#039; will not be replicated. Each ldap node manages its own local &#039;&#039;usn&#039;&#039;&lt;br /&gt;
* if you use a configured [[{{NAMESPACE}}:Services/LDAP/Replicator|&#039;&#039;Poll Timer&#039;&#039;]] the notify feature will not be used in this ldap session&lt;br /&gt;
&lt;br /&gt;
=Algorithmic and Technical Details=&lt;br /&gt;
This section covers details the incremental replication is based on, enabling the transition from full- to incremental replication.&lt;br /&gt;
==epoch==&lt;br /&gt;
The master&#039;s Root DSE contains or does not contain an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;, reflecting the GUID attribute of an existing object by the name &#039;&#039;&#039;_admin_&#039;&#039;&#039;. A slave must permanently store the epoch as a persistent VARiable &#039;&#039;&#039;epoch&#039;&#039;&#039;.&lt;br /&gt;
*Slave connects and BINDs to master&lt;br /&gt;
*Slave requests Root DSE from master&lt;br /&gt;
*Slave evalutates &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is not present&lt;br /&gt;
***=&amp;gt;Full replication&lt;br /&gt;
***Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
**&#039;&#039;epoch&#039;&#039; is present&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; matches slave&#039;s copy&lt;br /&gt;
****=&amp;gt;Incremental replication&lt;br /&gt;
***&#039;&#039;epoch&#039;&#039; does not match slave&#039;s copy&lt;br /&gt;
****Delete copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
****=&amp;gt;Full replication&lt;br /&gt;
****Store copy of &#039;&#039;epoch&#039;&#039;&lt;br /&gt;
*Slave, persistent &#039;&#039;epoch&#039;&#039; storage&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/epoc-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==USN Processing==&lt;br /&gt;
Every object features the attribute &#039;&#039;&#039;USN&#039;&#039;&#039;. A slave keeps track of the highest USN seen within all objects rx&#039;ed from a master. &lt;br /&gt;
*Slave checks USN for objects rx&#039;ed from master&lt;br /&gt;
**No local record of a highest USN&lt;br /&gt;
***=&amp;gt;Store current USN as highest USN&lt;br /&gt;
**Local copy of highest USN existing&lt;br /&gt;
***RX&#039;ed USN greater than local USN copy&lt;br /&gt;
****=&amp;gt;Store current USN as highest USN&lt;br /&gt;
***RX&#039;ed USN less or equal than local USN copy&lt;br /&gt;
****=&amp;gt;NOP, nothing to be done&lt;br /&gt;
&lt;br /&gt;
*Slave, persistent USN storage&lt;br /&gt;
**Replication completed - at the end of a full or incremental replication. Also, when rx&#039;ing notify search results from a master.&lt;br /&gt;
***=&amp;gt;Persistently storing the volatile memorized highest USN&lt;br /&gt;
**Variable: &#039;&#039;&#039;LREPI/u-r/cn=PBX0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Paging==&lt;br /&gt;
Incremental paging requires an additional filter term spedifying a USN value. &lt;br /&gt;
*1st Search&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (&amp;amp;(objectclass=*)&#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039;) The USN-Term contains the highest USN rx&#039;ed during last replication run, plus 1.&lt;br /&gt;
***Cookie &amp;lt;empty&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate &#039;&#039;&#039;(usn&amp;gt;=103)&#039;&#039;&#039; and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
*2nd Search,..&lt;br /&gt;
**Slave&lt;br /&gt;
***Filter (objectclass=*)&lt;br /&gt;
***Cookie &amp;lt;Last Cookie content rx&#039;ed from server&amp;gt;&lt;br /&gt;
**Server&lt;br /&gt;
***Evaluate cookie and set cursor at corresponding item &lt;br /&gt;
***Replies with entries and non-empty(more) or empty(final) cookie&lt;br /&gt;
&lt;br /&gt;
==Root DSE==&lt;br /&gt;
Because of the Flash Directory also exporting some infos into the Root DSE it probably makes sense to inform there about the current GUID of the &#039;&#039;_admin_&#039;&#039; object. Following excerpt represents this by an attribute &#039;&#039;&#039;epoch&#039;&#039;&#039;. A slave can comfortably compare this to its copy of the epoch last seen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Getting 1 entries:&lt;br /&gt;
&amp;gt;&amp;gt; Dn: &lt;br /&gt;
	1&amp;gt; epoch: 0B1581AF783F67018F170050568214B4; &lt;br /&gt;
..&lt;br /&gt;
	1&amp;gt; ldapServiceName: IP6013-50-00-68; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==VARs==&lt;br /&gt;
Noteable variables for persistent storage of some replication control data within a slave&#039;s VARs section.&lt;br /&gt;
;LDAP Replication, remote highest USN:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/u-r/cn=PBX0 p 102&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/u-r/cn=KBX0 p 105&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;LDAP Replication, remote last seen epoch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars create LREPI/epoc-r/cn=KPBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
..&lt;br /&gt;
vars create LREPI/epoc-r/cn=PBX0 pb 5238705224c067016fd10090334117be&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Restore on Master==&lt;br /&gt;
A restore of an older configuration on a master causes a new GUID for the object with the name &#039;&#039;_ADMIN_&#039;&#039;.&lt;br /&gt;
*A new configuration is going to be uploaded&lt;br /&gt;
*The Flash Directory processes the module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 erase-all&amp;lt;/pre&amp;gt;&lt;br /&gt;
**The FLASH Directory erases it&#039;s entire database, awaiting further commands&lt;br /&gt;
*The FLASH Directory processes a module command &amp;lt;pre&amp;gt;mod cmd FLASHDIR0 add-item 102 (cn=_ADMIN_)..(guid;bin=5238705224C067016FD10090334117BE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
**This is the Admin object. Before being stored, it will now get assigned a new random GUID&lt;br /&gt;
*The Admin object&#039;s new GUID gets now promoted as the new &#039;&#039;epoch&#039;&#039; for the master&#039;s database&lt;br /&gt;
&lt;br /&gt;
==Detecting Obsolete Objects==&lt;br /&gt;
Objects with the isDeleted attribute, a.k.a. tombstones, shall persist ideally forever. In practice tombstones get erased after a timeout. Only the most recent tombstone (tombstone with highest USN) remains.&lt;br /&gt;
;Current tombstone timeout: 48 hours&lt;br /&gt;
===Behaviour during Full Replication===&lt;br /&gt;
The local phase takes place in full. The replicator pages over all local objects and compares them with the master to see if they are still present.&lt;br /&gt;
===Behaviour during Incremental Replication===&lt;br /&gt;
The local phase is completely eliminated, respectively skipped.&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Interfaces/ETH/802.1X&amp;diff=75459</id>
		<title>Reference15r1:Interfaces/ETH/802.1X</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Interfaces/ETH/802.1X&amp;diff=75459"/>
		<updated>2025-03-06T09:57:09Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: Added 15r1/802.1X&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;&#039;&#039;&#039;Desired Protocol&#039;&#039;&#039;: Preferred EAP mechanism. Either EAP-MD5 (default) or EAP-TLS&lt;br /&gt;
;&#039;&#039;&#039;Identity&#039;&#039;&#039;: Optional configuration for an identity string within an EAP-Identity-Response.&lt;br /&gt;
;&#039;&#039;&#039;EAP-MD5&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;User&#039;&#039;&#039; Enter the user/identity to authenticate with.&lt;br /&gt;
* &#039;&#039;&#039;Password&#039;&#039;&#039; Enter the shared secret for the MD5 challenge/response handshake.&lt;br /&gt;
;&#039;&#039;&#039;EAP-TLS&#039;&#039;&#039;:&lt;br /&gt;
* The configuration for an actual certificate, being fed into the EAP-TLS session, can be found at &#039;&#039;General/Certificates/Device Certificate&#039;&#039;.&lt;br /&gt;
;&#039;&#039;&#039;Proxy-Logoff&#039;&#039;&#039;:&lt;br /&gt;
If the phone&#039;s PC-port got disconnected, EAPOL-Logoff messages are going to be sent on behalf of participants that were connected to the phone&#039;s PC-port.&lt;br /&gt;
An EAPOL-Logoff will be sent for each MAC-address learned from traversing EAPOL-Start messages.&lt;br /&gt;
&lt;br /&gt;
=Related Articles=&lt;br /&gt;
[[Concept_802.1X|Concept 802.1X]]&lt;br /&gt;
&lt;br /&gt;
[[Howto11r1:802.1X_EAP-TLS_With_FreeRadius|Howto article: 802.1X EAP-TLS With FreeRadius]]&lt;br /&gt;
&lt;br /&gt;
[[Howto:Security_works_with_innovaphone#802.1X_port_security|Howto article:Security_works_with_innovaphone]]&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto15r1:Implement_PBX_with_zero_downtime_using_IPVA_and_VMWare_Fault_Tolerance&amp;diff=74464</id>
		<title>Howto15r1:Implement PBX with zero downtime using IPVA and VMWare Fault Tolerance</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto15r1:Implement_PBX_with_zero_downtime_using_IPVA_and_VMWare_Fault_Tolerance&amp;diff=74464"/>
		<updated>2024-12-10T17:46:35Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Prepare your VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
==Applies To==&lt;br /&gt;
This information applies to&lt;br /&gt;
&lt;br /&gt;
* IPVA 15r1&lt;br /&gt;
* VMWare ESXi (vSphere) 6.7 - 8&lt;br /&gt;
* VMWare vCenter Server 6.7 - 8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Keywords: high availability  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==More Information==&lt;br /&gt;
===Problem Details===&lt;br /&gt;
The standby functionality implemented in the innovaphone PBX enables to start PBX software on the standby gateway in fail over scenario.  A drawback in this implementation is following - since the standby PBX is running on other physical gateway, all active calls and connections are interrupted while switching from master to standby. The switch to standby hardware takes a while, so the downtime about 2 minutes must be considered additionally.&lt;br /&gt;
&lt;br /&gt;
To be able to implement a PBX with zero downtime on hardware failures, a VMWare [http://www.vmware.com/de/products/vsphere/features/fault-tolerance.html Fault Tolerance(FT)] feature of the VMWare vSphere can be used. Therefore the PBX must be implemented on the innovaphone Virtual Appliance (IPVA) and the Virtual Machine running IPVA must be hosted on a FT-enabled VMWare Cluster.&lt;br /&gt;
&lt;br /&gt;
===System Requirements===&lt;br /&gt;
The VMWare infrastructure must fulfil following requirements to be able to run FT-enabled VMs:&lt;br /&gt;
* VMware vSphere Advanced or Enterprise Edition (FT Support included in this editions)&lt;br /&gt;
* The CPU and chip-set of the Hosts must support Fault Tolerance.&lt;br /&gt;
* The ESXi/vSphere hosts must be equipped with same CPU type and be part of FT-enabled Cluster&lt;br /&gt;
&lt;br /&gt;
===Prepare your VM===&lt;br /&gt;
If you want to use FT you need to use the IPVA Version which includes SCSI-Disks, it&#039;s not possible to use the &amp;quot;Old&amp;quot; IPVA with IDE-Disks. &lt;br /&gt;
To Run the SCSI-IPVA on VMware, you need to do Following steps:&lt;br /&gt;
* Download and unzip &#039;&#039;&#039;ipva-vmx-scsi.zip&#039;&#039;&#039;&lt;br /&gt;
* Convert all 4 disks to the VM by using the following command.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vmkfstools -i /vmfs/volumes/datastore/current-VM-folder/disk.vmdk /vmfs/volumes/datastore/new-VM-folder/disk.vmdk&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Now you need to attach the New Disks to your VM:&lt;br /&gt;
# You need to detach your old Disks from your IPVA in the settings of your IPVA itself. &lt;br /&gt;
# After you removed all the old Disks, you now need to open the Settings of your IPVA itself again and attach the new Disks.&lt;br /&gt;
# You need to make sure the Disks are on the correct SCSI controllers&lt;br /&gt;
# The Disks need to be on following Positions&lt;br /&gt;
## hd.boot.vmdk SCSI-Controller 0 0:0&lt;br /&gt;
## hd-cf.vmdk SCSI-Controller 0 0:1&lt;br /&gt;
## hd-flash.vmdk SCSI-Controller 1 1:0&lt;br /&gt;
## hd-dump.vmdk SCSI-Controller 1 1:1&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
For detailed implementation of FT-enabled VMWare infrastructure, please refer to the [https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-availability/GUID-7525F8DD-9B8F-4089-B020-BAA4AC6509D2.html VMWare documentation].&lt;br /&gt;
&lt;br /&gt;
On the IPVA side no special settings or changes must be performed to enable FT.&lt;br /&gt;
&lt;br /&gt;
We have tested the FT functionality with following setup and also in our cloud setup:&lt;br /&gt;
&lt;br /&gt;
[[File:FT Test setup.png|ft_test_setup.png/|ft_test_setup.png/]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While testing the Softphones where in a conference and also calling a WQ. While in an active call, a failure of ESXi/vSphere host was simulated. While testing multiple times, there were some noticeable interruptions in the media stream were realized, while the failover. Even with Video streams there were no problem and everything worked without noticeable problematic behavior.&lt;br /&gt;
&lt;br /&gt;
===Migration===&lt;br /&gt;
To Migrate your existing System to an FT-System, you need to set up a SCSI-IPVA and Download the Config(NOT download with standard password) from your old IPVA. Upload it to your new SCSI-IPVA. Please make sure you give your new VM the same MAC-Address as the old VM, so there won&#039;t be any issues. &lt;br /&gt;
&lt;br /&gt;
===Known Problems===&lt;br /&gt;
The Fault Tolerance does not protect the system from software failures(e.g. trap of the IPVA).&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
*[[Reference15r1:Concept Innovaphone Virtual Appliance]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=73053</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=73053"/>
		<updated>2024-08-15T12:50:56Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Latest News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
innovaphone only carries out scheduled remote maintenance via our ticket system by prior consultation.&amp;lt;br&amp;gt;&lt;br /&gt;
Please do not accept AnyDesk requests without prior appointment via ticket.&lt;br /&gt;
&lt;br /&gt;
Please ensure that you download the [https://anydesk.com/en/downloads/windows latest AnyDesk version].&lt;br /&gt;
&lt;br /&gt;
Please note: We cannot accept any liability for the external content of AnyDesk. AnyDesk is responsible for the content of its own software.&lt;br /&gt;
We are not liable for any damages resulting from the use of a non-updated or non-conforming version of AnyDesk.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have Google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales@innovaphone.com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] ([[User talk:Inno-mst|talk]]) 14:47, 15 August 2024 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V14r2 product/14r2/firmware 1420322 (sr 1) available | Version 14r2 Service Release 1]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] ([[User talk:Inno-mst|talk]]) 14:47, 15 August 2024 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V14r1 product/14r1/firmware 1410555 (sr 6) available | Version 14r1 Service Release 6]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] ([[User talk:Inno-mst|talk]]) 14:47, 15 August 2024 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r3 product/13r3/firmware 137975 (sr 18) available | Version 13r3 Service Release 18]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] ([[User talk:Inno-mst|talk]]) 14:47, 15 August 2024 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r2 product/12r2/firmware 125883 (sr 68) available | Version 12r2 Service Release 68]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Cam|Cam]] 16:22, 18 September 2023 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[App Calculator beta1 available]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Sga|Sga]] ([[User talk:Sga|talk]]) 17:43, 15 September 2023 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP73 1011 (5.0.1) released | Wireless Handset Firmware IP73 1011 (5.0.1)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Gal|Gal]] ([[User talk:Gal|talk]]) 13:39, 31 July 2023 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP64 10314 (3.0.13)/IP65 10119 (3.0.13) released | Wireless Handset Firmware IP64 10314 (3.0.13)/IP65 10119 (3.0.13)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Cam|Cam]] 12:03, 31 July 2023 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[App Working final available]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:38, 6 February 2023 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP62_3040621_(6.2.7)_released | Wireless Handset Firmware IP62 3040621 (6.2.7)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 13:13, 6 February 2023 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM_Software_3130113_%284.1.8%29_released | WinPDM Software 3130113 (4.1.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10313_(2.12.10)/IP65_10118_(2.12.10)_released | Wireless Handset Firmware IP64 10313 (2.12.10)/IP65 10118 (2.12.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 16 June 2021 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:iQM_Build_8029100_available | IQM Build 8029100 Hotfix34]] is now available from the [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Linux_Application_Platform_100271_(sr64)_available | Linux Application Platform V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Reporting_100271_(sr64)_available | innovaphone Reporting V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Fax_100271_(sr64)_available | innovaphone Fax V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Exchange_Calendar_Connector_100271_(sr64)_available | innovaphone Exchange Calendar Connector V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP61_3022811_(4.7.8)/IP63_3022912_(4.7.8)_released | Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_and_Management_Software_product/9.00/wireless_100037_%28hotfix19%29_available | Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 07:56, 9 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:App_Platform_build_90007_available | App Platform build 90007]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 02 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Recording_Build_121100_available | innovaphone Recording SR29 build 121100]] is now available from the [http://download.innovaphone.com/ice/10.00/#recording V10 download area].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
&amp;lt;!-- https://www.mediawiki.org/wiki/Extension:Newest_Pages --&amp;gt;&lt;br /&gt;
{{Special:Newestpages/all/20}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=73049</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=73049"/>
		<updated>2024-08-15T12:47:11Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Latest News */ Patchday August&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
innovaphone only carries out scheduled remote maintenance via our ticket system by prior consultation.&amp;lt;br&amp;gt;&lt;br /&gt;
Please do not accept AnyDesk requests without prior appointment via ticket.&lt;br /&gt;
&lt;br /&gt;
Please ensure that you download the [https://anydesk.com/en/downloads/windows latest AnyDesk version].&lt;br /&gt;
&lt;br /&gt;
Please note: We cannot accept any liability for the external content of AnyDesk. AnyDesk is responsible for the content of its own software.&lt;br /&gt;
We are not liable for any damages resulting from the use of a non-updated or non-conforming version of AnyDesk.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have Google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales@innovaphone.com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] ([[User talk:Inno-mst|talk]]) 14:47, 15 August 2024 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V14r2 product/14r2/firmware 1420322 (sr 1) available | Version 14r2 Service Release 1]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] ([[User talk:Inno-mst|talk]]) 14:47, 15 August 2024 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V14r1 product/14r1/firmware 1410555 (sr 6) available | Version 14r1 Service Release 6]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] ([[User talk:Inno-mst|talk]]) 14:47, 15 August 2024 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r3 product/13r3/firmware 137975 (sr 18) available | Version 13r3 Service Release 18]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] ([[User talk:Inno-mst|talk]]) 14:47, 15 August 2024 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r2 product/12r2/firmware 125883 (sr 68) available | Version 12r2 Service Release 68]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Aer|Aer]] ([[User talk:Aer|talk]]) 16:30, 24 May 2024 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r2 product/12r2/firmware 125882 (sr 67) available | Version 12r2 Service Release 67]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Cam|Cam]] 16:22, 18 September 2023 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[App Calculator beta1 available]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Sga|Sga]] ([[User talk:Sga|talk]]) 17:43, 15 September 2023 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP73 1011 (5.0.1) released | Wireless Handset Firmware IP73 1011 (5.0.1)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Gal|Gal]] ([[User talk:Gal|talk]]) 13:39, 31 July 2023 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless Handset Firmware IP64 10314 (3.0.13)/IP65 10119 (3.0.13) released | Wireless Handset Firmware IP64 10314 (3.0.13)/IP65 10119 (3.0.13)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Cam|Cam]] 12:03, 31 July 2023 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[App Working final available]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:38, 6 February 2023 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP62_3040621_(6.2.7)_released | Wireless Handset Firmware IP62 3040621 (6.2.7)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 13:13, 6 February 2023 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM_Software_3130113_%284.1.8%29_released | WinPDM Software 3130113 (4.1.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 11:22, 14 April 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Operator9 90246 (hotfix24) available | Operator9 hotfix24]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10313_(2.12.10)/IP65_10118_(2.12.10)_released | Wireless Handset Firmware IP64 10313 (2.12.10)/IP65 10118 (2.12.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 16 June 2021 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:iQM_Build_8029100_available | IQM Build 8029100 Hotfix34]] is now available from the [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Linux_Application_Platform_100271_(sr64)_available | Linux Application Platform V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Reporting_100271_(sr64)_available | innovaphone Reporting V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Fax_100271_(sr64)_available | innovaphone Fax V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Exchange_Calendar_Connector_100271_(sr64)_available | innovaphone Exchange Calendar Connector V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP61_3022811_(4.7.8)/IP63_3022912_(4.7.8)_released | Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_and_Management_Software_product/9.00/wireless_100037_%28hotfix19%29_available | Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 07:56, 9 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:App_Platform_build_90007_available | App Platform build 90007]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 02 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Recording_Build_121100_available | innovaphone Recording SR29 build 121100]] is now available from the [http://download.innovaphone.com/ice/10.00/#recording V10 download area].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
&amp;lt;!-- https://www.mediawiki.org/wiki/Extension:Newest_Pages --&amp;gt;&lt;br /&gt;
{{Special:Newestpages/all/20}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72841</id>
		<title>Reference14r2:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72841"/>
		<updated>2024-07-25T11:34:33Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Manually Exporting all Contacts */ Removed obsoleted paragraph &amp;quot;Manually Exporting all Contacts&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 14r2&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Semicolon (;) separated CSV file&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control visibility of an address book.&lt;br /&gt;
== 14r2 Features ==&lt;br /&gt;
Features added to the version 14r2&lt;br /&gt;
;User-Interface improvements&lt;br /&gt;
: Contact entries retrieved are rendered in a condensed card representation. A &#039;&#039;&#039;Details&#039;&#039;&#039;-button expands and displays remaining contact information&lt;br /&gt;
;Presence Updates&lt;br /&gt;
:Useful in federation scenarios. For displayed and currently visible contact entries, presence monitoring calls are placed, in order to display availablity status. Underlying resources are going to be freed immediately for entries scrolled out of visibility. &lt;br /&gt;
;Fax button&lt;br /&gt;
:Placing a call to a fax number is going to start the fax application&lt;br /&gt;
;Adding Contacts from the Softphone App&lt;br /&gt;
:Contacts can be added by means of a button &#039;&#039;&#039;Softphone/Call List/&amp;lt;entry&amp;gt;/&amp;quot;Add Contact&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
;Import, export for personal directories&lt;br /&gt;
New buttons &#039;&#039;&#039;Hamburger/Directories/&amp;lt;directory&amp;gt;/Import,Export&#039;&#039;&#039; allow for CSV-download and -upload respectively.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3 - version 14r2 is recommended.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
From 13r3 to 14r2 no special upgrade scenarios need to be considered as the database structure remains the same. On the other hand, if the new com.innovaphone.contacts API will be used (which helps to add contacts from within the phone apps) and a manual update is performed then the Websocket Checkmark should be set on the PBX App Object. &lt;br /&gt;
&lt;br /&gt;
For prior versions please consider the following:&lt;br /&gt;
&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. The 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
=== Contacts App (innovaphone-contacts) ===&lt;br /&gt;
The regular app&lt;br /&gt;
=== Contacts Admin App (innovaphone-contacts-admin) ===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
=== Contacts Search API (innovaphone-contacts-searchapi) ===&lt;br /&gt;
This hidden app rovides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formatted number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formatted version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifying the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
;uuid&lt;br /&gt;
:A constant universal unique id as string. Internally assigned during entry creation.&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note, that access to restricted/personal phone books requires the proprietary scheme within the LDAP client, mentioned above.&lt;br /&gt;
&lt;br /&gt;
Currently, this is available in the innovaphone IP phone LDAP clients from 13r3 on, but not on 3rd party devices nor our DECT gateways (IP120x). On these clients, only contact data in unrestricted phone books is searched.&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
Contact entries can be added, edited and deleted. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
:Click on &#039;&#039;&#039;+Contact&#039;&#039;&#039; and proceed. If no directory existed before, one will be automatically created by the name pattern &#039;&#039;&#039;Personal Directory: &amp;lt;user&#039;s short name&amp;gt;&#039;&#039;&#039;.&lt;br /&gt;
:Or click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share globally&lt;br /&gt;
*Either remove all rules from a personal directory. Such a configuration corresponds to pre-13r3 capabilities. Up to 13r2 there weren&#039;t any visibility rules available.&lt;br /&gt;
*Or make every PBX user an active member of a group e.g. &amp;quot;everybody&amp;quot; and add a directory rule for that group &amp;quot;everybody&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available users. Select the user, whom you want to give access and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available PBX groups. Also select, if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
The Contacts Admin App allows uploading a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation, a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading, the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[{{NAMESPACE}}:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and &#039;&#039;&#039;&#039;&#039;App WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
A directory is deleteable by clicking &#039;&#039;&#039;Hamburger/Directories/&amp;lt;directory&amp;gt;/Delete(Symbol: Trash-Can)&#039;&#039;&#039; and a progressing through the confirmation dialog afterwards.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
== DECT Phones Cannot Access Personal Directories ==&lt;br /&gt;
DECT gateways do not support the mechanism required to query into directories with restricted access rules. Hence, DECT mobile phones cannot search into such directories.&lt;br /&gt;
&lt;br /&gt;
== No automatic ACL update on name changes ==&lt;br /&gt;
If a users h323 name is changed, all ACL entries in address books, to which the user has rights, also need to be changed manually, since there is no automatic update between the PBX and the address books.&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72840</id>
		<title>Reference14r2:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72840"/>
		<updated>2024-07-25T11:32:24Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Manually Deleting an uploaded File */ Advertised new delete button&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 14r2&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Semicolon (;) separated CSV file&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control visibility of an address book.&lt;br /&gt;
== 14r2 Features ==&lt;br /&gt;
Features added to the version 14r2&lt;br /&gt;
;User-Interface improvements&lt;br /&gt;
: Contact entries retrieved are rendered in a condensed card representation. A &#039;&#039;&#039;Details&#039;&#039;&#039;-button expands and displays remaining contact information&lt;br /&gt;
;Presence Updates&lt;br /&gt;
:Useful in federation scenarios. For displayed and currently visible contact entries, presence monitoring calls are placed, in order to display availablity status. Underlying resources are going to be freed immediately for entries scrolled out of visibility. &lt;br /&gt;
;Fax button&lt;br /&gt;
:Placing a call to a fax number is going to start the fax application&lt;br /&gt;
;Adding Contacts from the Softphone App&lt;br /&gt;
:Contacts can be added by means of a button &#039;&#039;&#039;Softphone/Call List/&amp;lt;entry&amp;gt;/&amp;quot;Add Contact&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
;Import, export for personal directories&lt;br /&gt;
New buttons &#039;&#039;&#039;Hamburger/Directories/&amp;lt;directory&amp;gt;/Import,Export&#039;&#039;&#039; allow for CSV-download and -upload respectively.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3 - version 14r2 is recommended.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
From 13r3 to 14r2 no special upgrade scenarios need to be considered as the database structure remains the same. On the other hand, if the new com.innovaphone.contacts API will be used (which helps to add contacts from within the phone apps) and a manual update is performed then the Websocket Checkmark should be set on the PBX App Object. &lt;br /&gt;
&lt;br /&gt;
For prior versions please consider the following:&lt;br /&gt;
&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. The 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
=== Contacts App (innovaphone-contacts) ===&lt;br /&gt;
The regular app&lt;br /&gt;
=== Contacts Admin App (innovaphone-contacts-admin) ===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
=== Contacts Search API (innovaphone-contacts-searchapi) ===&lt;br /&gt;
This hidden app rovides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formatted number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formatted version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifying the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
;uuid&lt;br /&gt;
:A constant universal unique id as string. Internally assigned during entry creation.&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note, that access to restricted/personal phone books requires the proprietary scheme within the LDAP client, mentioned above.&lt;br /&gt;
&lt;br /&gt;
Currently, this is available in the innovaphone IP phone LDAP clients from 13r3 on, but not on 3rd party devices nor our DECT gateways (IP120x). On these clients, only contact data in unrestricted phone books is searched.&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
Contact entries can be added, edited and deleted. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
:Click on &#039;&#039;&#039;+Contact&#039;&#039;&#039; and proceed. If no directory existed before, one will be automatically created by the name pattern &#039;&#039;&#039;Personal Directory: &amp;lt;user&#039;s short name&amp;gt;&#039;&#039;&#039;.&lt;br /&gt;
:Or click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share globally&lt;br /&gt;
*Either remove all rules from a personal directory. Such a configuration corresponds to pre-13r3 capabilities. Up to 13r2 there weren&#039;t any visibility rules available.&lt;br /&gt;
*Or make every PBX user an active member of a group e.g. &amp;quot;everybody&amp;quot; and add a directory rule for that group &amp;quot;everybody&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available users. Select the user, whom you want to give access and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available PBX groups. Also select, if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
The Contacts Admin App allows uploading a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation, a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading, the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[{{NAMESPACE}}:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and &#039;&#039;&#039;&#039;&#039;App WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
A directory is deleteable by clicking &#039;&#039;&#039;Hamburger/Directories/&amp;lt;directory&amp;gt;/Delete(Symbol: Trash-Can)&#039;&#039;&#039; and a progressing through the confirmation dialog afterwards.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Exporting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to export all contacts from the database. &lt;br /&gt;
This task can be accomplished by reading the main table &#039;&#039;entries&#039;&#039;, separate attributes by ; and store the result in a given csv-file.&lt;br /&gt;
The csv-file has to be located in a separate folder with appropriate access rights.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#create new folder export and grant access rights &lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; mkdir export&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; chmod 777 export&lt;br /&gt;
&lt;br /&gt;
#Retrieve all database entries, separate them by ; and store in file&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;copy entries to &#039;/mnt/sda2/home/admin/export/contacts.csv&#039; delimiter &#039;;&#039; CSV HEADER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated csv-file can be downloaded by use of an sftp-client (e.g. WinSCP) and login to the AP with admin credentials.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
== DECT Phones Cannot Access Personal Directories ==&lt;br /&gt;
DECT gateways do not support the mechanism required to query into directories with restricted access rules. Hence, DECT mobile phones cannot search into such directories.&lt;br /&gt;
&lt;br /&gt;
== No automatic ACL update on name changes ==&lt;br /&gt;
If a users h323 name is changed, all ACL entries in address books, to which the user has rights, also need to be changed manually, since there is no automatic update between the PBX and the address books.&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72839</id>
		<title>Reference14r2:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72839"/>
		<updated>2024-07-25T11:23:18Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Maintain a Personal Address Book */ Added directory creation via &amp;quot;+Contact&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 14r2&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Semicolon (;) separated CSV file&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control visibility of an address book.&lt;br /&gt;
== 14r2 Features ==&lt;br /&gt;
Features added to the version 14r2&lt;br /&gt;
;User-Interface improvements&lt;br /&gt;
: Contact entries retrieved are rendered in a condensed card representation. A &#039;&#039;&#039;Details&#039;&#039;&#039;-button expands and displays remaining contact information&lt;br /&gt;
;Presence Updates&lt;br /&gt;
:Useful in federation scenarios. For displayed and currently visible contact entries, presence monitoring calls are placed, in order to display availablity status. Underlying resources are going to be freed immediately for entries scrolled out of visibility. &lt;br /&gt;
;Fax button&lt;br /&gt;
:Placing a call to a fax number is going to start the fax application&lt;br /&gt;
;Adding Contacts from the Softphone App&lt;br /&gt;
:Contacts can be added by means of a button &#039;&#039;&#039;Softphone/Call List/&amp;lt;entry&amp;gt;/&amp;quot;Add Contact&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
;Import, export for personal directories&lt;br /&gt;
New buttons &#039;&#039;&#039;Hamburger/Directories/&amp;lt;directory&amp;gt;/Import,Export&#039;&#039;&#039; allow for CSV-download and -upload respectively.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3 - version 14r2 is recommended.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
From 13r3 to 14r2 no special upgrade scenarios need to be considered as the database structure remains the same. On the other hand, if the new com.innovaphone.contacts API will be used (which helps to add contacts from within the phone apps) and a manual update is performed then the Websocket Checkmark should be set on the PBX App Object. &lt;br /&gt;
&lt;br /&gt;
For prior versions please consider the following:&lt;br /&gt;
&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. The 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
=== Contacts App (innovaphone-contacts) ===&lt;br /&gt;
The regular app&lt;br /&gt;
=== Contacts Admin App (innovaphone-contacts-admin) ===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
=== Contacts Search API (innovaphone-contacts-searchapi) ===&lt;br /&gt;
This hidden app rovides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formatted number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formatted version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifying the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
;uuid&lt;br /&gt;
:A constant universal unique id as string. Internally assigned during entry creation.&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note, that access to restricted/personal phone books requires the proprietary scheme within the LDAP client, mentioned above.&lt;br /&gt;
&lt;br /&gt;
Currently, this is available in the innovaphone IP phone LDAP clients from 13r3 on, but not on 3rd party devices nor our DECT gateways (IP120x). On these clients, only contact data in unrestricted phone books is searched.&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
Contact entries can be added, edited and deleted. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
:Click on &#039;&#039;&#039;+Contact&#039;&#039;&#039; and proceed. If no directory existed before, one will be automatically created by the name pattern &#039;&#039;&#039;Personal Directory: &amp;lt;user&#039;s short name&amp;gt;&#039;&#039;&#039;.&lt;br /&gt;
:Or click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share globally&lt;br /&gt;
*Either remove all rules from a personal directory. Such a configuration corresponds to pre-13r3 capabilities. Up to 13r2 there weren&#039;t any visibility rules available.&lt;br /&gt;
*Or make every PBX user an active member of a group e.g. &amp;quot;everybody&amp;quot; and add a directory rule for that group &amp;quot;everybody&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available users. Select the user, whom you want to give access and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available PBX groups. Also select, if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
The Contacts Admin App allows uploading a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation, a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading, the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[{{NAMESPACE}}:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and &#039;&#039;&#039;&#039;&#039;App WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
If multiple files or multiple versions of a CSV file were uploaded, it might not be clear how to delete an old data set. Here is an example for how to accomplish a deletion of a particular data set related to an imported CSV file:&lt;br /&gt;
*2 Files were previously imported&lt;br /&gt;
**&#039;&#039;allcontacts.csv&#039;&#039;&lt;br /&gt;
**&#039;&#039;brs%20testimport.csv&#039;&#039;&lt;br /&gt;
*The file &#039;&#039;brs%20testimport.csv&#039;&#039; shall be deleted&lt;br /&gt;
*Hints&lt;br /&gt;
**Within the Contacts database, the table &#039;&#039;dbs&#039;&#039; contains the names of files once imported.&lt;br /&gt;
**The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Command &#039;psql&#039;. Printing the table &#039;dbs&#039;. Contains 2 file names.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |         uri&lt;br /&gt;
----+----------------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
  5 | brs%20testimport.csv&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
#Delete the file &amp;quot;brs%20testimport.csv&amp;quot; via its table-ID 5.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from dbs where id=5&amp;quot;&lt;br /&gt;
DELETE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Printing the table &#039;dbs&#039;. Contains 1 file name.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |       uri&lt;br /&gt;
----+-----------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Exporting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to export all contacts from the database. &lt;br /&gt;
This task can be accomplished by reading the main table &#039;&#039;entries&#039;&#039;, separate attributes by ; and store the result in a given csv-file.&lt;br /&gt;
The csv-file has to be located in a separate folder with appropriate access rights.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#create new folder export and grant access rights &lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; mkdir export&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; chmod 777 export&lt;br /&gt;
&lt;br /&gt;
#Retrieve all database entries, separate them by ; and store in file&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;copy entries to &#039;/mnt/sda2/home/admin/export/contacts.csv&#039; delimiter &#039;;&#039; CSV HEADER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated csv-file can be downloaded by use of an sftp-client (e.g. WinSCP) and login to the AP with admin credentials.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
== DECT Phones Cannot Access Personal Directories ==&lt;br /&gt;
DECT gateways do not support the mechanism required to query into directories with restricted access rules. Hence, DECT mobile phones cannot search into such directories.&lt;br /&gt;
&lt;br /&gt;
== No automatic ACL update on name changes ==&lt;br /&gt;
If a users h323 name is changed, all ACL entries in address books, to which the user has rights, also need to be changed manually, since there is no automatic update between the PBX and the address books.&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72838</id>
		<title>Reference14r2:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72838"/>
		<updated>2024-07-25T11:16:39Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Personal Address Book Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 14r2&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Semicolon (;) separated CSV file&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control visibility of an address book.&lt;br /&gt;
== 14r2 Features ==&lt;br /&gt;
Features added to the version 14r2&lt;br /&gt;
;User-Interface improvements&lt;br /&gt;
: Contact entries retrieved are rendered in a condensed card representation. A &#039;&#039;&#039;Details&#039;&#039;&#039;-button expands and displays remaining contact information&lt;br /&gt;
;Presence Updates&lt;br /&gt;
:Useful in federation scenarios. For displayed and currently visible contact entries, presence monitoring calls are placed, in order to display availablity status. Underlying resources are going to be freed immediately for entries scrolled out of visibility. &lt;br /&gt;
;Fax button&lt;br /&gt;
:Placing a call to a fax number is going to start the fax application&lt;br /&gt;
;Adding Contacts from the Softphone App&lt;br /&gt;
:Contacts can be added by means of a button &#039;&#039;&#039;Softphone/Call List/&amp;lt;entry&amp;gt;/&amp;quot;Add Contact&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
;Import, export for personal directories&lt;br /&gt;
New buttons &#039;&#039;&#039;Hamburger/Directories/&amp;lt;directory&amp;gt;/Import,Export&#039;&#039;&#039; allow for CSV-download and -upload respectively.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3 - version 14r2 is recommended.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
From 13r3 to 14r2 no special upgrade scenarios need to be considered as the database structure remains the same. On the other hand, if the new com.innovaphone.contacts API will be used (which helps to add contacts from within the phone apps) and a manual update is performed then the Websocket Checkmark should be set on the PBX App Object. &lt;br /&gt;
&lt;br /&gt;
For prior versions please consider the following:&lt;br /&gt;
&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. The 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
=== Contacts App (innovaphone-contacts) ===&lt;br /&gt;
The regular app&lt;br /&gt;
=== Contacts Admin App (innovaphone-contacts-admin) ===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
=== Contacts Search API (innovaphone-contacts-searchapi) ===&lt;br /&gt;
This hidden app rovides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formatted number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formatted version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifying the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
;uuid&lt;br /&gt;
:A constant universal unique id as string. Internally assigned during entry creation.&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note, that access to restricted/personal phone books requires the proprietary scheme within the LDAP client, mentioned above.&lt;br /&gt;
&lt;br /&gt;
Currently, this is available in the innovaphone IP phone LDAP clients from 13r3 on, but not on 3rd party devices nor our DECT gateways (IP120x). On these clients, only contact data in unrestricted phone books is searched.&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
Contact entries can be added, edited and deleted. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
Click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share globally&lt;br /&gt;
*Either remove all rules from a personal directory. Such a configuration corresponds to pre-13r3 capabilities. Up to 13r2 there weren&#039;t any visibility rules available.&lt;br /&gt;
*Or make every PBX user an active member of a group e.g. &amp;quot;everybody&amp;quot; and add a directory rule for that group &amp;quot;everybody&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available users. Select the user, whom you want to give access and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available PBX groups. Also select, if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
The Contacts Admin App allows uploading a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation, a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading, the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[{{NAMESPACE}}:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and &#039;&#039;&#039;&#039;&#039;App WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
If multiple files or multiple versions of a CSV file were uploaded, it might not be clear how to delete an old data set. Here is an example for how to accomplish a deletion of a particular data set related to an imported CSV file:&lt;br /&gt;
*2 Files were previously imported&lt;br /&gt;
**&#039;&#039;allcontacts.csv&#039;&#039;&lt;br /&gt;
**&#039;&#039;brs%20testimport.csv&#039;&#039;&lt;br /&gt;
*The file &#039;&#039;brs%20testimport.csv&#039;&#039; shall be deleted&lt;br /&gt;
*Hints&lt;br /&gt;
**Within the Contacts database, the table &#039;&#039;dbs&#039;&#039; contains the names of files once imported.&lt;br /&gt;
**The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Command &#039;psql&#039;. Printing the table &#039;dbs&#039;. Contains 2 file names.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |         uri&lt;br /&gt;
----+----------------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
  5 | brs%20testimport.csv&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
#Delete the file &amp;quot;brs%20testimport.csv&amp;quot; via its table-ID 5.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from dbs where id=5&amp;quot;&lt;br /&gt;
DELETE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Printing the table &#039;dbs&#039;. Contains 1 file name.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |       uri&lt;br /&gt;
----+-----------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Exporting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to export all contacts from the database. &lt;br /&gt;
This task can be accomplished by reading the main table &#039;&#039;entries&#039;&#039;, separate attributes by ; and store the result in a given csv-file.&lt;br /&gt;
The csv-file has to be located in a separate folder with appropriate access rights.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#create new folder export and grant access rights &lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; mkdir export&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; chmod 777 export&lt;br /&gt;
&lt;br /&gt;
#Retrieve all database entries, separate them by ; and store in file&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;copy entries to &#039;/mnt/sda2/home/admin/export/contacts.csv&#039; delimiter &#039;;&#039; CSV HEADER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated csv-file can be downloaded by use of an sftp-client (e.g. WinSCP) and login to the AP with admin credentials.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
== DECT Phones Cannot Access Personal Directories ==&lt;br /&gt;
DECT gateways do not support the mechanism required to query into directories with restricted access rules. Hence, DECT mobile phones cannot search into such directories.&lt;br /&gt;
&lt;br /&gt;
== No automatic ACL update on name changes ==&lt;br /&gt;
If a users h323 name is changed, all ACL entries in address books, to which the user has rights, also need to be changed manually, since there is no automatic update between the PBX and the address books.&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72837</id>
		<title>Reference14r2:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72837"/>
		<updated>2024-07-25T11:11:51Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Features */ Added 14r2 Features&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 14r2&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Semicolon (;) separated CSV file&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control visibility of an address book.&lt;br /&gt;
== 14r2 Features ==&lt;br /&gt;
Features added to the version 14r2&lt;br /&gt;
;User-Interface improvements&lt;br /&gt;
: Contact entries retrieved are rendered in a condensed card representation. A &#039;&#039;&#039;Details&#039;&#039;&#039;-button expands and displays remaining contact information&lt;br /&gt;
;Presence Updates&lt;br /&gt;
:Useful in federation scenarios. For displayed and currently visible contact entries, presence monitoring calls are placed, in order to display availablity status. Underlying resources are going to be freed immediately for entries scrolled out of visibility. &lt;br /&gt;
;Fax button&lt;br /&gt;
:Placing a call to a fax number is going to start the fax application&lt;br /&gt;
;Adding Contacts from the Softphone App&lt;br /&gt;
:Contacts can be added by means of a button &#039;&#039;&#039;Softphone/Call List/&amp;lt;entry&amp;gt;/&amp;quot;Add Contact&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
;Import, export for personal directories&lt;br /&gt;
New buttons &#039;&#039;&#039;Hamburger/Directories/&amp;lt;directory&amp;gt;/Import,Export&#039;&#039;&#039; allow for CSV-download and -upload respectively.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3 - version 14r2 is recommended.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
From 13r3 to 14r2 no special upgrade scenarios need to be considered as the database structure remains the same. On the other hand, if the new com.innovaphone.contacts API will be used (which helps to add contacts from within the phone apps) and a manual update is performed then the Websocket Checkmark should be set on the PBX App Object. &lt;br /&gt;
&lt;br /&gt;
For prior versions please consider the following:&lt;br /&gt;
&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. The 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
=== Contacts App (innovaphone-contacts) ===&lt;br /&gt;
The regular app&lt;br /&gt;
=== Contacts Admin App (innovaphone-contacts-admin) ===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
=== Contacts Search API (innovaphone-contacts-searchapi) ===&lt;br /&gt;
This hidden app rovides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formatted number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formatted version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifying the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
;uuid&lt;br /&gt;
:A constant universal unique id as string. Internally assigned during entry creation.&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note, that access to restricted/personal phone books requires the proprietary scheme within the LDAP client, mentioned above.&lt;br /&gt;
&lt;br /&gt;
Currently, this is available in the innovaphone IP phone LDAP clients from 13r3 on, but not on 3rd party devices nor our DECT gateways (IP120x). On these clients, only contact data in unrestricted phone books is searched.&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
From version 13r3 on it is possible, to add, editing and delete contacts. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
Click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share globally&lt;br /&gt;
*Either remove all rules from a personal directory. Such a configuration corresponds to pre-13r3 capabilities. Up to 13r2 there weren&#039;t any visibility rules available.&lt;br /&gt;
*Or make every PBX user an active member of a group e.g. &amp;quot;everybody&amp;quot; and add a directory rule for that group &amp;quot;everybody&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available users. Select the user, whom you want to give access and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available PBX groups. Also select, if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
The Contacts Admin App allows uploading a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation, a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading, the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[{{NAMESPACE}}:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and &#039;&#039;&#039;&#039;&#039;App WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
If multiple files or multiple versions of a CSV file were uploaded, it might not be clear how to delete an old data set. Here is an example for how to accomplish a deletion of a particular data set related to an imported CSV file:&lt;br /&gt;
*2 Files were previously imported&lt;br /&gt;
**&#039;&#039;allcontacts.csv&#039;&#039;&lt;br /&gt;
**&#039;&#039;brs%20testimport.csv&#039;&#039;&lt;br /&gt;
*The file &#039;&#039;brs%20testimport.csv&#039;&#039; shall be deleted&lt;br /&gt;
*Hints&lt;br /&gt;
**Within the Contacts database, the table &#039;&#039;dbs&#039;&#039; contains the names of files once imported.&lt;br /&gt;
**The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Command &#039;psql&#039;. Printing the table &#039;dbs&#039;. Contains 2 file names.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |         uri&lt;br /&gt;
----+----------------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
  5 | brs%20testimport.csv&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
#Delete the file &amp;quot;brs%20testimport.csv&amp;quot; via its table-ID 5.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from dbs where id=5&amp;quot;&lt;br /&gt;
DELETE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Printing the table &#039;dbs&#039;. Contains 1 file name.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |       uri&lt;br /&gt;
----+-----------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Exporting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to export all contacts from the database. &lt;br /&gt;
This task can be accomplished by reading the main table &#039;&#039;entries&#039;&#039;, separate attributes by ; and store the result in a given csv-file.&lt;br /&gt;
The csv-file has to be located in a separate folder with appropriate access rights.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#create new folder export and grant access rights &lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; mkdir export&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; chmod 777 export&lt;br /&gt;
&lt;br /&gt;
#Retrieve all database entries, separate them by ; and store in file&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;copy entries to &#039;/mnt/sda2/home/admin/export/contacts.csv&#039; delimiter &#039;;&#039; CSV HEADER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated csv-file can be downloaded by use of an sftp-client (e.g. WinSCP) and login to the AP with admin credentials.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
== DECT Phones Cannot Access Personal Directories ==&lt;br /&gt;
DECT gateways do not support the mechanism required to query into directories with restricted access rules. Hence, DECT mobile phones cannot search into such directories.&lt;br /&gt;
&lt;br /&gt;
== No automatic ACL update on name changes ==&lt;br /&gt;
If a users h323 name is changed, all ACL entries in address books, to which the user has rights, also need to be changed manually, since there is no automatic update between the PBX and the address books.&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72835</id>
		<title>Reference14r2:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Service_Contacts&amp;diff=72835"/>
		<updated>2024-07-25T10:44:54Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* List of Attributes */ added uuid&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 14r2&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Semicolon (;) separated CSV file&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control visibility of an address book.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3 - version 14r2 is recommended.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
From 13r3 to 14r2 no special upgrade scenarios need to be considered as the database structure remains the same. On the other hand, if the new com.innovaphone.contacts API will be used (which helps to add contacts from within the phone apps) and a manual update is performed then the Websocket Checkmark should be set on the PBX App Object. &lt;br /&gt;
&lt;br /&gt;
For prior versions please consider the following:&lt;br /&gt;
&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. The 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
=== Contacts App (innovaphone-contacts) ===&lt;br /&gt;
The regular app&lt;br /&gt;
=== Contacts Admin App (innovaphone-contacts-admin) ===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
=== Contacts Search API (innovaphone-contacts-searchapi) ===&lt;br /&gt;
This hidden app rovides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formatted number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formatted version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifying the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
;uuid&lt;br /&gt;
:A constant universal unique id as string. Internally assigned during entry creation.&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note, that access to restricted/personal phone books requires the proprietary scheme within the LDAP client, mentioned above.&lt;br /&gt;
&lt;br /&gt;
Currently, this is available in the innovaphone IP phone LDAP clients from 13r3 on, but not on 3rd party devices nor our DECT gateways (IP120x). On these clients, only contact data in unrestricted phone books is searched.&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
From version 13r3 on it is possible, to add, editing and delete contacts. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
Click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share globally&lt;br /&gt;
*Either remove all rules from a personal directory. Such a configuration corresponds to pre-13r3 capabilities. Up to 13r2 there weren&#039;t any visibility rules available.&lt;br /&gt;
*Or make every PBX user an active member of a group e.g. &amp;quot;everybody&amp;quot; and add a directory rule for that group &amp;quot;everybody&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available users. Select the user, whom you want to give access and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available PBX groups. Also select, if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
The Contacts Admin App allows uploading a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation, a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading, the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[{{NAMESPACE}}:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and &#039;&#039;&#039;&#039;&#039;App WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
If multiple files or multiple versions of a CSV file were uploaded, it might not be clear how to delete an old data set. Here is an example for how to accomplish a deletion of a particular data set related to an imported CSV file:&lt;br /&gt;
*2 Files were previously imported&lt;br /&gt;
**&#039;&#039;allcontacts.csv&#039;&#039;&lt;br /&gt;
**&#039;&#039;brs%20testimport.csv&#039;&#039;&lt;br /&gt;
*The file &#039;&#039;brs%20testimport.csv&#039;&#039; shall be deleted&lt;br /&gt;
*Hints&lt;br /&gt;
**Within the Contacts database, the table &#039;&#039;dbs&#039;&#039; contains the names of files once imported.&lt;br /&gt;
**The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Command &#039;psql&#039;. Printing the table &#039;dbs&#039;. Contains 2 file names.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |         uri&lt;br /&gt;
----+----------------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
  5 | brs%20testimport.csv&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
#Delete the file &amp;quot;brs%20testimport.csv&amp;quot; via its table-ID 5.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from dbs where id=5&amp;quot;&lt;br /&gt;
DELETE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Printing the table &#039;dbs&#039;. Contains 1 file name.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |       uri&lt;br /&gt;
----+-----------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Exporting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to export all contacts from the database. &lt;br /&gt;
This task can be accomplished by reading the main table &#039;&#039;entries&#039;&#039;, separate attributes by ; and store the result in a given csv-file.&lt;br /&gt;
The csv-file has to be located in a separate folder with appropriate access rights.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#create new folder export and grant access rights &lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; mkdir export&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; chmod 777 export&lt;br /&gt;
&lt;br /&gt;
#Retrieve all database entries, separate them by ; and store in file&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;copy entries to &#039;/mnt/sda2/home/admin/export/contacts.csv&#039; delimiter &#039;;&#039; CSV HEADER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated csv-file can be downloaded by use of an sftp-client (e.g. WinSCP) and login to the AP with admin credentials.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
== DECT Phones Cannot Access Personal Directories ==&lt;br /&gt;
DECT gateways do not support the mechanism required to query into directories with restricted access rules. Hence, DECT mobile phones cannot search into such directories.&lt;br /&gt;
&lt;br /&gt;
== No automatic ACL update on name changes ==&lt;br /&gt;
If a users h323 name is changed, all ACL entries in address books, to which the user has rights, also need to be changed manually, since there is no automatic update between the PBX and the address books.&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=70890</id>
		<title>Reference13r3:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=70890"/>
		<updated>2024-02-20T15:54:47Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* List of Text-Indexable Attributes */ Removed &amp;#039;Info&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 13r3&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Semicolon (;) separated CSV file&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control visibility of an address book.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. This 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
=== Contacts App (innovaphone-contacts) ===&lt;br /&gt;
The regular app&lt;br /&gt;
=== Contacts Admin App (innovaphone-contacts-admin) ===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
=== Contacts Search API (innovaphone-contacts-searchapi) ===&lt;br /&gt;
This hidden app rovides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formatted number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formatted version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifying the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note, that access to restricted/personal phone books requires the proprietary scheme within the LDAP client, mentioned above.&lt;br /&gt;
&lt;br /&gt;
Currently, this is available in the innovaphone IP phone LDAP clients from 13r3 on, but not on 3rd party devices nor our DECT gateways (IP120x). On these clients, only contact data in unrestricted phone books is searched.&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
With version 13r3 it is now possible, to add, editing and delete contacts. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
Click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Symbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share globally&lt;br /&gt;
*Either remove all rules from a personal directory. Such a configuration corresponds to pre-13r3 capabilities. Up to 13r2 there weren&#039;t any visibility rules available.&lt;br /&gt;
*Or make every PBX user an active member of a group e.g. &amp;quot;everybody&amp;quot; and add a directory rule for that group &amp;quot;everybody&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available users. Select the user, whom you want to give access and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. In the input field, you can enter and therefore filter for all available PBX groups. Also select, if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
The Contacts Admin App allows uploading a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation, a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading, the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[{{NAMESPACE}}:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and App &#039;&#039;&#039;&#039;&#039;WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
If multiple files or multiple versions of a CSV file were uploaded, it might not be clear how to delete an old data set. Here is an example for how to accomplish a deletion of a particular data set related to an imported CSV file:&lt;br /&gt;
*2 Files were previously imported&lt;br /&gt;
**&#039;&#039;allcontacts.csv&#039;&#039;&lt;br /&gt;
**&#039;&#039;brs%20testimport.csv&#039;&#039;&lt;br /&gt;
*The file &#039;&#039;brs%20testimport.csv&#039;&#039; shall be deleted&lt;br /&gt;
*Hints&lt;br /&gt;
**Within the Contacts database, the table &#039;&#039;dbs&#039;&#039; contains the names of files once imported.&lt;br /&gt;
**The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Command &#039;psql&#039;. Printing the table &#039;dbs&#039;. Contains 2 file names.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |         uri&lt;br /&gt;
----+----------------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
  5 | brs%20testimport.csv&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
#Delete the file &amp;quot;brs%20testimport.csv&amp;quot; via its table-ID 5.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from dbs where id=5&amp;quot;&lt;br /&gt;
DELETE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Printing the table &#039;dbs&#039;. Contains 1 file name.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |       uri&lt;br /&gt;
----+-----------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Exporting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to export all contacts from the database. &lt;br /&gt;
This task can be accomplished by reading the main table &#039;&#039;entries&#039;&#039;, separate attributes by ; and store the result in a given csv-file.&lt;br /&gt;
The csv-file has to be located in a separate folder with appropriate access rights.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#create new folder export and grant access rights &lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; mkdir export&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; chmod 777 export&lt;br /&gt;
&lt;br /&gt;
#Retrieve all database entries, separate them by ; and store in file&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;copy entries to &#039;/mnt/sda2/home/admin/export/contacts.csv&#039; delimiter &#039;;&#039; CSV HEADER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated csv-file can be downloaded by use of an sftp-client (e.g. WinSCP) and login to the AP with admin credentials.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
== DECT Phones Cannot Access Personal Directories ==&lt;br /&gt;
DECT gateways do not support the mechanism required to query into directories with restricted access rules. Hence, DECT mobile phones cannot search into such directories.&lt;br /&gt;
&lt;br /&gt;
== No automatic ACL update on name changes ==&lt;br /&gt;
If a users h323 name is changed, all ACL entries in address books, to which the user has rights, also need to be changed manually, since there is no automatic update between the PBX and the address books.&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r1:Concept_Innovaphone_Virtual_Appliance_(IPVA)&amp;diff=70033</id>
		<title>Reference14r1:Concept Innovaphone Virtual Appliance (IPVA)</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r1:Concept_Innovaphone_Virtual_Appliance_(IPVA)&amp;diff=70033"/>
		<updated>2023-12-01T11:47:59Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: Added Upgrade to Version 14&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept12r1|{{PAGENAME}}]]&lt;br /&gt;
{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&amp;lt;!--ipva virtual virtuell va--&amp;gt;&lt;br /&gt;
==Applies To==&lt;br /&gt;
This information applies to:&lt;br /&gt;
*V14r1&lt;br /&gt;
*innovaphone Virtual Appliance&lt;br /&gt;
*Intel/AMD CPUs&lt;br /&gt;
* Virtualization platforms&lt;br /&gt;
**VMware&lt;br /&gt;
*** Workstation&lt;br /&gt;
*** Player&lt;br /&gt;
*** vSphere 4.x-6.x&lt;br /&gt;
*** ESXi 6.0&lt;br /&gt;
**Microsoft Hyper-V ([[{{NAMESPACE}}:Concept IPVA On Hyper-V]])&lt;br /&gt;
*** Windows 8.1&lt;br /&gt;
*** Windows 10&lt;br /&gt;
*** Windows Server 2012 R2&lt;br /&gt;
*** Windows Server 2016 CTP4&lt;br /&gt;
**Linux based Hypervisors with [https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine KVM] and [https://en.wikipedia.org/wiki/QEMU QEMU] support&lt;br /&gt;
*** Proxmox VE 8.0 / 8.1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: Manufacturers/versions of VM platforms other than those specified here have not been tested, so use at your own risk.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==More Information==&lt;br /&gt;
The innovaphone Virtual Appliance (IPVA) is a virtual machine to be run on a virtualization platform.&lt;br /&gt;
&lt;br /&gt;
The IPVA is a software-only solution. It appears and behaves like an innovaphone &amp;quot;hard-box&amp;quot; without physical resources such as hardware DSP or ISDN interface.&lt;br /&gt;
&lt;br /&gt;
==Package Overview==&lt;br /&gt;
We supply an OVF (&#039;&#039;&#039;O&#039;&#039;&#039;pen &#039;&#039;&#039;V&#039;&#039;&#039;irtualization &#039;&#039;&#039;F&#039;&#039;&#039;ormat) import or - depending on the virtualization platform - a suitable variant.&lt;br /&gt;
OVF is an open standard that contains several files in one package. The .ovf file is therefore an archive that contains all the necessary files.&lt;br /&gt;
&lt;br /&gt;
=== Sample VMware ===&lt;br /&gt;
;ipva-ovf.zip:&lt;br /&gt;
The compressed archive &#039;&#039;ipva-ovf.zip&#039;&#039; contains the file ipva.ova. A deployment of ipva.ova will result in a set of 5 files - the file names may differ from the following list:&lt;br /&gt;
*ipva.vmx: The virtual machine configuration file&lt;br /&gt;
*hd-boot.vmdk: The virtual boot disk on IDE 0:0&lt;br /&gt;
*hd-cf.vmdk: The disk for emulation of a Compact Flash card on IDE 0:1&lt;br /&gt;
*hd-flash.vmdk: The disk for emulation of flash memory on IDE 1:0&lt;br /&gt;
*hd-dump.vmdk: The disk serving as a store for a crash dump on IDE 1:1&lt;br /&gt;
&lt;br /&gt;
;ipva.bin:&lt;br /&gt;
The file &#039;&#039;ipva.bin&#039;&#039; is the firmware file, which is only needed for update purposes.&lt;br /&gt;
&lt;br /&gt;
== Virtualization platforms ==&lt;br /&gt;
&lt;br /&gt;
===VMware Player / VMware Workstation===&lt;br /&gt;
==== Import new Machine ====&lt;br /&gt;
*Copy the file ipva.ova to e.g. your desktop and Double-click on ipva.ova.&lt;br /&gt;
*Edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
===VMware vSphere===&lt;br /&gt;
==== Import new Machine ====&lt;br /&gt;
*Import ipva.ova by means of &#039;&#039;&#039;File/Deploy OVF-Template...&#039;&#039;&#039; (de: &#039;&#039;&#039;Datei/OFV-Vorlage bereitstellen...&#039;&#039;&#039;) and follow instructions.&lt;br /&gt;
*Edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
===Microsoft Hyper-V===&lt;br /&gt;
==== Import new Machine ====&lt;br /&gt;
* Use the UI Wizard to Import a new machine&lt;br /&gt;
* Browse to the directory where the downloaded package was extracted to. Browse to the subdirectory Virtual Machines and click Ok&lt;br /&gt;
* Select &#039;&#039;Copy the Virtual Machine&#039;&#039; as &#039;&#039;Import Type&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Proxmox VE===&lt;br /&gt;
==== Import new Machine ====&lt;br /&gt;
Proxmox does not offer a UI option to import existing machines via ovf. The machine must be imported via shell.&lt;br /&gt;
&lt;br /&gt;
* Unzip ipva-qemu.zip and copy ipva-qemu.ova to a suitable disk location on Proxmox&lt;br /&gt;
* Navigate to your desired folder, extract and import the VM (&#039;&#039;think about the vm-id concept in Proxmox! - In this example, we use ID 503)&lt;br /&gt;
** &amp;lt;code&amp;gt;cd /mnt/pve/my-storage/images/ipva&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xvf ipva-qemu.ova&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;qm importovf 503 ipva-qemu.ovf local-lvm&amp;lt;/code&amp;gt;&lt;br /&gt;
* Before you start up the VM in the UI you have to configure the following:&lt;br /&gt;
** Hardware -&amp;gt; Add -&amp;gt; Network Device&lt;br /&gt;
*** add a new network adapter with model &#039;&#039;VirtIO&#039;&#039;&lt;br /&gt;
** Hardware -&amp;gt; Processors&lt;br /&gt;
*** adjust &amp;quot;Extra Cpu Flags&amp;quot; -&amp;gt; &amp;quot;aes&amp;quot; if required&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
&lt;br /&gt;
===Network Configuration===&lt;br /&gt;
Manufacturer-configured as DHCP client only. I.e. a DHCP server must be available. Afterwards the network configuration may be administrated as used to within the web ui of other innovaphone boxes. If there&#039;s in no case a DHCP server available for the 1st-time configuration, read through [[#What_Is_The_Console_Good_For?|What Is The Console Good For?]].&lt;br /&gt;
&lt;br /&gt;
====MAC/serial number====&lt;br /&gt;
Take care that you use a MAC address which is supported by my.innovaphone, see [[Reference:My_Innovaphone#IPVA_MAC_exists]].&lt;br /&gt;
&lt;br /&gt;
==Upgrade to Version 14==&lt;br /&gt;
Upgrading from a version prior to 14 to version 14r1.&lt;br /&gt;
===VMWare===&lt;br /&gt;
After deploying the new firmware modify the guest configuration file (stemming from ipva.vmx) as such:&lt;br /&gt;
Modify e.g. &amp;lt;code type=&amp;quot;text&amp;quot;&amp;gt;ethernet0.virtualDev = &amp;quot;vlance&amp;quot;&amp;lt;/code&amp;gt; to become &amp;lt;code type=&amp;quot;text&amp;quot;&amp;gt;ethernet0.virtualDev = &amp;quot;vmxnet3&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
Support procedures are commonly identical to the ones known from innovaphones&#039; physical appliances. Except for:&lt;br /&gt;
*&#039;&#039;&#039;Post-Mortem Logs&#039;&#039;&#039; A post-mortem log must be retrieved by clicking on &#039;&#039;Maintenance/Diagnostics/Tracing/&#039;&#039;&#039;trace(crash-dump)&#039;&#039;&#039;&#039;&#039; (alternatively: http://a.b.c.d/crash_dump.txt).&lt;br /&gt;
&lt;br /&gt;
Some known issues are listed further below under [[#FAQ | FAQ]].&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
=== Restored IPVA may not run ===&lt;br /&gt;
We have seen issues where an IPVA which had been backed up using one of the available backup tools for VMWare do not start up properly when they have been restored. &lt;br /&gt;
&lt;br /&gt;
We strongly suggest to not rely on VMWare backup mechanism but instead to use the standard innovaphone backup scheme (that is, save the configuration on a regular basis).&lt;br /&gt;
&lt;br /&gt;
==== How to run a restored backup that fails to start ====&lt;br /&gt;
Here is the procedure to run an IPVA from an IPVA if the restored virtual machine does not boot up properly:&lt;br /&gt;
&lt;br /&gt;
* restore the backed up V10 IPVA&lt;br /&gt;
* create a new, empty V11r1 IPVA (you will need this merely to copy the boot disk from)&lt;br /&gt;
*replace the boot disk of the failing V10 IPVA by the boot disk of the fresh V11r1 IPVA (see [[#How_To_Replace_The_Boot_Disk_On_vSphere.3F | How To Replace The Boot Disk On vSphere]] for details)&lt;br /&gt;
* start the restored and fixed V10 IPVA (it should run fine now)&lt;br /&gt;
* downgrade this V10 IPVA to desired V10 firmware&lt;br /&gt;
* remove the fresh V11r1 IPVA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some Customer who are running Fw v12r1 (up to sr6) with ESXi 6.0 and VEEAM 9 reported that after a backup with VEEAM 9, the restored IPVA was not starting. &lt;br /&gt;
At this point, there is no possibility to solve this problem. The only workaround in that case is to delete the machine, reinstall a new one, and restore a configuration saved before.&lt;br /&gt;
&lt;br /&gt;
If you did not run into the problem yet, for prevention, we recommend to replace the Boot disk of your working IPVA.vmx with one of the IPVA.ova. Please follow the steps below (be aware that this will upgrade the firmware on the IPVA to 12r2, due to the fact that actually, IPVA.ova is only available from version 12r2):&lt;br /&gt;
&lt;br /&gt;
1. Remove the Boot disk of the virtual machine (vmx)(is normaly the first one).&amp;lt;br&amp;gt;&lt;br /&gt;
* Power off the VM&lt;br /&gt;
* Select the Virtual Machine &amp;gt; Settings.&lt;br /&gt;
* On the Hardware tab, select the virtual hard disk and click &#039;&#039;Remove&#039;&#039;.&lt;br /&gt;
* Click &#039;&#039;OK&#039;&#039; to save your changes.&lt;br /&gt;
&lt;br /&gt;
2. Add the Boot disk of the ova virtual machine to the vmx one.&lt;br /&gt;
* Identify the size of the boot disk of the ova virtual machine (will be needed on the step when navigating to boot disk)&lt;br /&gt;
* On the powered off VM, Select the Virtual Machine &amp;gt; Settings.&lt;br /&gt;
* On the Hardware tab, select the virtual hard disk and click &#039;&#039;Add&#039;&#039;.&lt;br /&gt;
* Select Use “an existing virtual disk” then click &#039;&#039;Next&#039;&#039;.&lt;br /&gt;
* Navigate to the boot disk of the ova Virtual machine then click &#039;&#039;next&#039;&#039;.&lt;br /&gt;
* Click &#039;&#039;Finish&#039;&#039;.&lt;br /&gt;
Now the vmx virtual machine should have the Fw version 12r2.&lt;br /&gt;
&lt;br /&gt;
The .ova version will be available also in V12r1 sr7&lt;br /&gt;
&lt;br /&gt;
=== IPVA does not run on Citrix Cloud Platform ===&lt;br /&gt;
Reportedly, the Citrix cloud platform - although based on VMware - cannot run the IPVA.  Amongst other issues, the platform does not allow 4 virtual disks, which are required for the IPVA.&lt;br /&gt;
&lt;br /&gt;
=== IPVA does not run on VCloud Air ===&lt;br /&gt;
VCloud Air apparently does not support the timekeeping mechanism required by the IPVA.&lt;br /&gt;
&lt;br /&gt;
[[User:Ckl|ckl]] 15:50, 30 November 2016 (CET) We have seen the IPVA v12r2 running on vCloud Air. Use the ova import.&lt;br /&gt;
&lt;br /&gt;
=== IPVA on ESX 6.5 ===&lt;br /&gt;
We have reports that the IPVA does not run properly on ESX 6.5.  The IPVA boots up properly but the clock does not run.  Running the .ova based variation available in v12r2 fixed the issue or edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
=== Administration: Avoid &#039;reboot&#039; Command. Use &#039;reset&#039; Command ===&lt;br /&gt;
Alwas use the &#039;reset&#039; command to restart an IPVA. &lt;br /&gt;
The &#039;reboot&#039; command makes sense only on physical applicances, where its purpose is to deploy a new bootcode by means of a forced watchdog trap. The resulting post-reboot state will be as if an unsolicited trap/crash had occurred.&lt;br /&gt;
&lt;br /&gt;
=== No Fault Tolerance Support from VMWare vSphere 6.5 ===&lt;br /&gt;
We have reports that VMWare vSphere 6.5 Fault Tolerance (FT) no longer works. For further information regarding this feature, please refer to the respective note in [[Howto:Implement_PBX_with_zero_downtime_using_IPVA_and_VMWare_Fault_Tolerance | Implement PBX with zero downtime using IPVA and VMWare Fault_Tolerance]].&lt;br /&gt;
&lt;br /&gt;
=== Voice Quality Issues ===&lt;br /&gt;
When dealing with media streams (e.g. for announcements), the IPVA needs to fulfil real-time processing requirements, for example to process RTP packets in a timely fashion.  To do so, the IPVA relies on the capabilities of the virtualization platform it runs on. &lt;br /&gt;
&lt;br /&gt;
It is therefore important to configure the platform so that it supports real-time applications best. If you experience voice quality or latency issues, consider &lt;br /&gt;
* to make sure that all of the IPVAs memory is &#039;&#039;reserved&#039;&#039; to the IPVA (&#039;&#039;Latency Sensitivity&#039;&#039; set to &#039;&#039;High&#039;&#039;)&lt;br /&gt;
* to guarantee exclusive PCPU access&lt;br /&gt;
This helps to reduce CPU halt/wake-up states.&lt;br /&gt;
&lt;br /&gt;
===Additional vCPUs may cause problems===&lt;br /&gt;
The Multi-Core functionality of version 13r2 is a beta functionality. Additional virtual CPUs(vCPUs) should not be utilized in production environments.&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
===Can The Emulated CompactFlash Be Increased In Size?===&lt;br /&gt;
Yes, from within the &#039;&#039;Edit Virtual Machine&#039;&#039; dialog. Doing so just increases the size of the virtual harddisk. The emulated CompactFlash must be formatted afterwards and accordingly to benefit from the increased size. That step can be administrated from &#039;&#039;Administration/Compact Flash/Format&#039;&#039;. Note: A recommendation for an upper size limit is not given.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;vSphere / vSphere Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. At first backup all of your files from CF card&amp;lt;br&amp;gt;&lt;br /&gt;
2. Shutdown the corresponding IPVA&amp;lt;br&amp;gt;&lt;br /&gt;
3. Choose &amp;quot;Properties&amp;quot; of the IPVA&amp;lt;br&amp;gt;&lt;br /&gt;
4. Delete &amp;quot;Harddrive 2&amp;quot; (Hardrive file xxx/xxx_1.vmdk)&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 hd-boot.vmdk  &amp;gt; xxx.vmdk&lt;br /&gt;
 hd-cf.vmdk    &amp;gt; xxx_1.vmdk&lt;br /&gt;
 hd-flash.vmdk &amp;gt; xxx_2.vmdk&lt;br /&gt;
 hd-dump.vmdk  &amp;gt; xxx_3.vmdk&lt;br /&gt;
&lt;br /&gt;
5. Create new harddrive&amp;lt;br&amp;gt;&lt;br /&gt;
6. Configure the required size&amp;lt;br&amp;gt;&lt;br /&gt;
7. As &amp;quot;Node of virtual device&amp;quot; select &amp;quot;IDE(0:1)&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
8. Start the IPVA.&amp;lt;br&amp;gt;&lt;br /&gt;
9. &amp;quot;Format&amp;quot; the CF Card and &amp;quot;mount&amp;quot; it (General/Compact-Flash/General)&lt;br /&gt;
&lt;br /&gt;
===What Is The Size Of the emulated Flash Storage on the IPVA?===&lt;br /&gt;
The virtual flash storage used to store configuration file of the IPVA and LDAP directory of the PBX is defined with 64 MB and can not be changed. This is two times more than on IP6010. The VMDK-File hd-flash.vmdk is allocated with 100 MB, because VMWare can not handle smaller virtual disks.&lt;br /&gt;
&lt;br /&gt;
===What Is The Size Of the Flash Directory on the IPVA?===&lt;br /&gt;
As noted above, the virtual flash memory on the IPVA is fixed to a size of 64MB.  Most of the flash is used by the &#039;&#039;flash directory&#039;&#039; (FLASHDIR0) which amongst other things provides storage for PBX objects.&lt;br /&gt;
&lt;br /&gt;
The size of the flash directory depends on the available RAM. The maximum of 900 segments á 64KB, i.e. ~56MB, is available if 192MB or more RAM is available. If less RAM is available, the size of the flash directory is decreased accordingly.  For this reason, it is unsafe to reduce RAM size in a given IPVA, as the flash directory size may be decreased so that objects from the flash directory get lost.&lt;br /&gt;
&lt;br /&gt;
The easiest method to see how much flash directory space is available is to investigate the boot trace. For the standard configuration of 64MB the respective trace output is going to look as follows and informs about a size of 14MB:&lt;br /&gt;
 &lt;br /&gt;
 0:0000:081:4 - start flashdir FLASHDIR0&lt;br /&gt;
 0:0000:081:4 - fdir: segments=901-&amp;gt;224(14.0MB)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===How Much RAM Is Required Per IPVA Instance?===&lt;br /&gt;
Since 12r2sr27/13r1sr5 the downloadable virtual appliance comes preconfigured with 256MB RAM. This amount is seen as a good trade-off for the majority of all installations.&lt;br /&gt;
The RAM-size can be administrated by VMware-means.&lt;br /&gt;
&lt;br /&gt;
===What Is The Maximum Amount Of RAM?===&lt;br /&gt;
The maximum meaningful RAM setting is 3GB. Memory space beyond that limit will be left unused. Assigning more than 3GB to an IPVA instance doesn&#039;t provide any benefit.&lt;br /&gt;
&lt;br /&gt;
===Why Does &#039;&#039;General/Info/DRAM&#039;&#039; Show Less Than the Configured Memory?===&lt;br /&gt;
Not all of the configured memory is available to the IPVA. E.g. a bit of memory is occupied by the VMM&amp;lt;ref&amp;gt;Virtual Machine Monitor: A component belonging to the virtualization platform&amp;lt;/ref&amp;gt;. The indicator &#039;&#039;General/Info/DRAM&#039;&#039; displays the memory available to the IPVA and is truncated down to a whole number. A boot-trace reveals a bit more about IPVA-available memory as shown in the following excerpt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
0:0000:030:4 - Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz&lt;br /&gt;
0:0000:030:4 - mem(64946176)=61.93MB ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How Many IPVA Instances Are Possible Per Host?===&lt;br /&gt;
There&#039;s no worst-case estimate available. For a best-case calculation, &lt;br /&gt;
*see [http://www.vmware.com/pdf/vsphere4/r41/vsp_41_config_max.pdf  Configuration Maximums VMware vSphere 4.1]&lt;br /&gt;
*see [[#How_Much_RAM_Is_Required_Per_IPVA_Instance.3F | How Much RAM Is Required Per IPVA Instance?]]&lt;br /&gt;
Additional preformance reflections&lt;br /&gt;
*see [[HOWTO:A_rough_estimate_of_IPVA_Performance | A rough estimate of IPVA Performance]]&lt;br /&gt;
&lt;br /&gt;
===How do I perform a factory reset?===&lt;br /&gt;
&lt;br /&gt;
replace the 3rd disk, served on IDE 1:0, named hd-flash.vmdk with an empty disk:&lt;br /&gt;
&lt;br /&gt;
[[Image:VM_Settings.png]]&lt;br /&gt;
&lt;br /&gt;
1)download the IPVA and watch out for the file hd-flash.vmdk&lt;br /&gt;
&lt;br /&gt;
2)Power-off the IPVA instance&lt;br /&gt;
&lt;br /&gt;
3)Replace hd-flash.vmdk with the one downloaded in step 1). If on vsphere it may have been assigned a different name. Ensure it’s the one on IDE 1:0.&lt;br /&gt;
&lt;br /&gt;
4)Power-on the IPVA instance&lt;br /&gt;
&lt;br /&gt;
===What About VMware Tools?===&lt;br /&gt;
VMware Tools are not supported.&lt;br /&gt;
&lt;br /&gt;
===What Is The Console Good For?===&lt;br /&gt;
The console is a remains of the early development phase. It resembles the IP3000&#039;s serial console. It doesn&#039;t offer any convenience like command history or backspace funtionality. Nevertheless may the console be of help in exceptional situations where e.g. the required DHCP server isn&#039;t available for 1st-time configuration or in situations where the ip configuration was misconfigured. Thereby any command from a device&#039;s config is acceptable. &lt;br /&gt;
&lt;br /&gt;
For instance to configure the static IP address 1.2.3.4/24 on ETH0:&lt;br /&gt;
*Click into the console&lt;br /&gt;
*Press ENTER&lt;br /&gt;
*Enter credentials&lt;br /&gt;
*Enter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config change IP0 ETH0 /addr 192.168.0.10 /mask 255.255.255.0&lt;br /&gt;
config change IP0 RT0 /gateway 192.168.0.1&lt;br /&gt;
config change DHCP0 /mode off&lt;br /&gt;
config write&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since no backspace is offered it may become a daring task to enter a single line without typos. In case of a typo hit ENTER and input the same line again.&lt;br /&gt;
The keyboard layout is the US layout.&lt;br /&gt;
[[Image:Ip-via-console.png|center|thumb|200px|Console-edit of IP address]]&lt;br /&gt;
&lt;br /&gt;
Display the IP configuration for ETH0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config show IP0 ETH0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Display the DHCP configuration for ETH0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config show DHCP0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional the DNS-server(s) and the default gateway can be configured:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config change IP0 ETH0 /addr 1.2.3.4 /mask 255.255.255.0 /dns 8.8.8.8 /dns2 8.8.4.4&lt;br /&gt;
config change IP0 RT0 /gateway 1.2.3.254&lt;br /&gt;
config change DHCP0 /mode off&lt;br /&gt;
config write&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also some simple diagnostics (ping and traceroute) are possible via the console (output is given in the console):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mod cmd PING0 tracert 8.8.8.8&lt;br /&gt;
mod cmd PING0 ping 8.8.8.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resetting the entire FLASH space - &#039;&#039;&#039;Note, all configuration will get lost&#039;&#039;&#039;. this is similar method to the manufacturer reset method from above [[#How_do_I_perform_a_factory_reset.3F|How do I perform a factory reset?]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mod cmd FLASHMAN0 reset all&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of A Checksum Boot Error?===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
checksum wrong! Loading failed for image=IPVA    BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:ipva-crc-wrong.jpg|center|thumb|200px|Console displays CRC boot error]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&lt;br /&gt;
*Power-off the IPVA&lt;br /&gt;
*Replace the boot harddisk by a fresh one. The boot harddisk is the 1st hd(originally named &#039;&#039;hd-boot.vmdk&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This problem may occur on a system crash while a firmware update is taking place.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;NIC unavailable!&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIC unavailable!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:ipva-nic-unavailable.jpg|center|thumb|200px|Console displays &#039;&#039;NIC unavailable!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&lt;br /&gt;
*Power-off the IPVA&lt;br /&gt;
*Administrate by VMware means: Ensure the correct/expected type of network interface controller(NIC) is going to be offered by the hypervisor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IPVA offers driver support for:&lt;br /&gt;
*AMD NIC: Am79C970A PCnet-PCI II Single-Chip Full-Duplex Ethernet Controller&lt;br /&gt;
**a.k.a &#039;&#039;PCNet32&#039;&#039;&lt;br /&gt;
**a.k.a &#039;&#039;Vlance&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The AMD-NIC is kind of default. However, the NIC type may be overriden manually and accordingly within the configuration file ipva.vmx as follows&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ethernet0.virtualDev = &amp;quot;vlance&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This problem may occur after a VMware re-configuration of the network settings.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
perfcounter-not enabled!!!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:screenshot-ipva-perfcounter-nok.jpg|center|thumb|200px|Console displays &#039;&#039;perfcounter-not enabled!!!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
This problem is likely caused by an OVA-import of the IPVA. The appliance&#039;s configuration file &#039;&#039;ipva.vmx&#039;&#039; requires a VMware proprietary configuration line that&#039;s not specifiable within an OVA-file. &lt;br /&gt;
&lt;br /&gt;
The IPVA utilizes a VMware proprietary mechanism for its internal timekeeping&amp;lt;ref&amp;gt;Timekeeping in Virtual Machines http://www.vmware.com/pdf/vmware_timekeeping.pdf&amp;lt;/ref&amp;gt;. That mechanism is only available after adding the following line to the configuration file &#039;&#039;ipva.vmx&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
monitor_control.pseudo_perfctr = TRUE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If that line is not present, the hypervisor is going to throw a CPU exception. Hint: In vSphere a VMX-file can be edited under &#039;&#039;&#039;Edit Settings/Options/Advanced/General/Configuration Parameters&#039;&#039;&#039;&amp;lt;ref&amp;gt;vmware Labs - How to edit vmx file in ESXi vSphere: https://www.youtube.com/watch?v=ICICoq-maB0&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
*The vmx file should be edited after the installation of the IPVA.&lt;br /&gt;
*The vmx file should NOT be edited with Text editor (use vSphere as shown above)&lt;br /&gt;
*To our knowledge, a converter is always necessary for the installation with vmx.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;Loading failed for image=IPVA    BIN&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Loading failed for image=IPVA    BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Ipva-fw-load-failed.png|center|thumb|200px|Console displays &#039;&#039;Loading failed for image=IPVA    BIN&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
This problem is likely caused by a calculation fault within the boot-code. &lt;br /&gt;
*The solution requires a replacement of the boot disk hd-boot.vmdk. &lt;br /&gt;
**Download an IPVA package from on 11r2 sr22.&lt;br /&gt;
**Replace the 1st disk with the one from the downloaded package&lt;br /&gt;
&lt;br /&gt;
===Are Additional vCPUs useful?===&lt;br /&gt;
The Multi-Core functionality of version 13r2 is a beta functionality. Additional virtual CPUs(vCPUs) should not be utilized in production environments.&lt;br /&gt;
&lt;br /&gt;
===How To Replace The Boot Disk On vSphere?===&lt;br /&gt;
The recommended way is as follows:&lt;br /&gt;
*With ipva.ova deploy a fresh IPVA by means of &#039;&#039;&#039;File/Deploy OVF-Template...&#039;&#039;&#039; (de: &#039;&#039;&#039;Datei/OFV-Vorlage bereitstellen...&#039;&#039;&#039;) and follow instructions.&lt;br /&gt;
**Its use to just serve as a copy source.&lt;br /&gt;
*Power-Off the old IPVA.&lt;br /&gt;
*In the old IPVA remove the 1st disk on IDE 0:0.&lt;br /&gt;
*From the new IPVA copy the 1st harddisk(on IDE 0:0) towards the old IPVA&#039;s directory.&lt;br /&gt;
*In the old IPVA add the 1st disk on IDE 0:0.&lt;br /&gt;
*In the old IPVA confirm and start the machine&lt;br /&gt;
&lt;br /&gt;
===What do the counters mean under Interface/Ethx/Statistic?===&lt;br /&gt;
;rx-drop: Accumulates register CSR112 &amp;lt;ref&amp;gt;Command and Status Register&amp;lt;/ref&amp;gt; of the emulated chip AM79C970. CSR112: Missed Frame Count. An increase of this value indicates the IPVA was not able to process the network frames fast enough.&lt;br /&gt;
;ifInDiscards: Sum of rx-drop, frames dropped due to interface link not up, unsupported ethernet type, internal receive queue full, drop frames of different vlan, drop non vlan frames if vlan is configured&lt;br /&gt;
;rx-frame-blocked: Unsupported IP protocol&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
[[{{NAMESPACE}}:Licenses]]&lt;br /&gt;
&lt;br /&gt;
[[Howto:A_rough_estimate_of_IPVA_Performance | Howto:A_rough_estimate_of_IPVA_Performance]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept|Innovaphone Virtual Appliance]]&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r1:Concept_Innovaphone_Virtual_Appliance_(IPVA)&amp;diff=70032</id>
		<title>Reference14r1:Concept Innovaphone Virtual Appliance (IPVA)</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r1:Concept_Innovaphone_Virtual_Appliance_(IPVA)&amp;diff=70032"/>
		<updated>2023-12-01T11:28:13Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Import new Machine */ Reference to downloadable ipva-qemu.zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept12r1|{{PAGENAME}}]]&lt;br /&gt;
{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&amp;lt;!--ipva virtual virtuell va--&amp;gt;&lt;br /&gt;
==Applies To==&lt;br /&gt;
This information applies to:&lt;br /&gt;
*V14r1&lt;br /&gt;
*innovaphone Virtual Appliance&lt;br /&gt;
*Intel/AMD CPUs&lt;br /&gt;
* Virtualization platforms&lt;br /&gt;
**VMware&lt;br /&gt;
*** Workstation&lt;br /&gt;
*** Player&lt;br /&gt;
*** vSphere 4.x-6.x&lt;br /&gt;
*** ESXi 6.0&lt;br /&gt;
**Microsoft Hyper-V ([[{{NAMESPACE}}:Concept IPVA On Hyper-V]])&lt;br /&gt;
*** Windows 8.1&lt;br /&gt;
*** Windows 10&lt;br /&gt;
*** Windows Server 2012 R2&lt;br /&gt;
*** Windows Server 2016 CTP4&lt;br /&gt;
**Linux based Hypervisors with [https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine KVM] and [https://en.wikipedia.org/wiki/QEMU QEMU] support&lt;br /&gt;
*** Proxmox VE 8.0 / 8.1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: Manufacturers/versions of VM platforms other than those specified here have not been tested, so use at your own risk.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==More Information==&lt;br /&gt;
The innovaphone Virtual Appliance (IPVA) is a virtual machine to be run on a virtualization platform.&lt;br /&gt;
&lt;br /&gt;
The IPVA is a software-only solution. It appears and behaves like an innovaphone &amp;quot;hard-box&amp;quot; without physical resources such as hardware DSP or ISDN interface.&lt;br /&gt;
&lt;br /&gt;
==Package Overview==&lt;br /&gt;
We supply an OVF (&#039;&#039;&#039;O&#039;&#039;&#039;pen &#039;&#039;&#039;V&#039;&#039;&#039;irtualization &#039;&#039;&#039;F&#039;&#039;&#039;ormat) import or - depending on the virtualization platform - a suitable variant.&lt;br /&gt;
OVF is an open standard that contains several files in one package. The .ovf file is therefore an archive that contains all the necessary files.&lt;br /&gt;
&lt;br /&gt;
=== Sample VMware ===&lt;br /&gt;
;ipva-ovf.zip:&lt;br /&gt;
The compressed archive &#039;&#039;ipva-ovf.zip&#039;&#039; contains the file ipva.ova. A deployment of ipva.ova will result in a set of 5 files - the file names may differ from the following list:&lt;br /&gt;
*ipva.vmx: The virtual machine configuration file&lt;br /&gt;
*hd-boot.vmdk: The virtual boot disk on IDE 0:0&lt;br /&gt;
*hd-cf.vmdk: The disk for emulation of a Compact Flash card on IDE 0:1&lt;br /&gt;
*hd-flash.vmdk: The disk for emulation of flash memory on IDE 1:0&lt;br /&gt;
*hd-dump.vmdk: The disk serving as a store for a crash dump on IDE 1:1&lt;br /&gt;
&lt;br /&gt;
;ipva.bin:&lt;br /&gt;
The file &#039;&#039;ipva.bin&#039;&#039; is the firmware file, which is only needed for update purposes.&lt;br /&gt;
&lt;br /&gt;
== Virtualization platforms ==&lt;br /&gt;
&lt;br /&gt;
===VMware Player / VMware Workstation===&lt;br /&gt;
==== Import new Machine ====&lt;br /&gt;
*Copy the file ipva.ova to e.g. your desktop and Double-click on ipva.ova.&lt;br /&gt;
*Edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
===VMware vSphere===&lt;br /&gt;
==== Import new Machine ====&lt;br /&gt;
*Import ipva.ova by means of &#039;&#039;&#039;File/Deploy OVF-Template...&#039;&#039;&#039; (de: &#039;&#039;&#039;Datei/OFV-Vorlage bereitstellen...&#039;&#039;&#039;) and follow instructions.&lt;br /&gt;
*Edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
===Microsoft Hyper-V===&lt;br /&gt;
==== Import new Machine ====&lt;br /&gt;
* Use the UI Wizard to Import a new machine&lt;br /&gt;
* Browse to the directory where the downloaded package was extracted to. Browse to the subdirectory Virtual Machines and click Ok&lt;br /&gt;
* Select &#039;&#039;Copy the Virtual Machine&#039;&#039; as &#039;&#039;Import Type&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Proxmox VE===&lt;br /&gt;
==== Import new Machine ====&lt;br /&gt;
Proxmox does not offer a UI option to import existing machines via ovf. The machine must be imported via shell.&lt;br /&gt;
&lt;br /&gt;
* Unzip ipva-qemu.zip and copy ipva-qemu.ova to a suitable disk location on Proxmox&lt;br /&gt;
* Navigate to your desired folder, extract and import the VM (&#039;&#039;think about the vm-id concept in Proxmox! - In this example, we use ID 503)&lt;br /&gt;
** &amp;lt;code&amp;gt;cd /mnt/pve/my-storage/images/ipva&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xvf ipva-qemu.ova&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;qm importovf 503 ipva-qemu.ovf local-lvm&amp;lt;/code&amp;gt;&lt;br /&gt;
* Before you start up the VM in the UI you have to configure the following:&lt;br /&gt;
** Hardware -&amp;gt; Add -&amp;gt; Network Device&lt;br /&gt;
*** add a new network adapter with model &#039;&#039;VirtIO&#039;&#039;&lt;br /&gt;
** Hardware -&amp;gt; Processors&lt;br /&gt;
*** adjust &amp;quot;Extra Cpu Flags&amp;quot; -&amp;gt; &amp;quot;aes&amp;quot; if required&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
&lt;br /&gt;
===Network Configuration===&lt;br /&gt;
Manufacturer-configured as DHCP client only. I.e. a DHCP server must be available. Afterwards the network configuration may be administrated as used to within the web ui of other innovaphone boxes. If there&#039;s in no case a DHCP server available for the 1st-time configuration, read through [[#What_Is_The_Console_Good_For?|What Is The Console Good For?]].&lt;br /&gt;
&lt;br /&gt;
====MAC/serial number====&lt;br /&gt;
Take care that you use a MAC address which is supported by my.innovaphone, see [[Reference:My_Innovaphone#IPVA_MAC_exists]].&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
Support procedures are commonly identical to the ones known from innovaphones&#039; physical appliances. Except for:&lt;br /&gt;
*&#039;&#039;&#039;Post-Mortem Logs&#039;&#039;&#039; A post-mortem log must be retrieved by clicking on &#039;&#039;Maintenance/Diagnostics/Tracing/&#039;&#039;&#039;trace(crash-dump)&#039;&#039;&#039;&#039;&#039; (alternatively: http://a.b.c.d/crash_dump.txt).&lt;br /&gt;
&lt;br /&gt;
Some known issues are listed further below under [[#FAQ | FAQ]].&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
=== Restored IPVA may not run ===&lt;br /&gt;
We have seen issues where an IPVA which had been backed up using one of the available backup tools for VMWare do not start up properly when they have been restored. &lt;br /&gt;
&lt;br /&gt;
We strongly suggest to not rely on VMWare backup mechanism but instead to use the standard innovaphone backup scheme (that is, save the configuration on a regular basis).&lt;br /&gt;
&lt;br /&gt;
==== How to run a restored backup that fails to start ====&lt;br /&gt;
Here is the procedure to run an IPVA from an IPVA if the restored virtual machine does not boot up properly:&lt;br /&gt;
&lt;br /&gt;
* restore the backed up V10 IPVA&lt;br /&gt;
* create a new, empty V11r1 IPVA (you will need this merely to copy the boot disk from)&lt;br /&gt;
*replace the boot disk of the failing V10 IPVA by the boot disk of the fresh V11r1 IPVA (see [[#How_To_Replace_The_Boot_Disk_On_vSphere.3F | How To Replace The Boot Disk On vSphere]] for details)&lt;br /&gt;
* start the restored and fixed V10 IPVA (it should run fine now)&lt;br /&gt;
* downgrade this V10 IPVA to desired V10 firmware&lt;br /&gt;
* remove the fresh V11r1 IPVA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some Customer who are running Fw v12r1 (up to sr6) with ESXi 6.0 and VEEAM 9 reported that after a backup with VEEAM 9, the restored IPVA was not starting. &lt;br /&gt;
At this point, there is no possibility to solve this problem. The only workaround in that case is to delete the machine, reinstall a new one, and restore a configuration saved before.&lt;br /&gt;
&lt;br /&gt;
If you did not run into the problem yet, for prevention, we recommend to replace the Boot disk of your working IPVA.vmx with one of the IPVA.ova. Please follow the steps below (be aware that this will upgrade the firmware on the IPVA to 12r2, due to the fact that actually, IPVA.ova is only available from version 12r2):&lt;br /&gt;
&lt;br /&gt;
1. Remove the Boot disk of the virtual machine (vmx)(is normaly the first one).&amp;lt;br&amp;gt;&lt;br /&gt;
* Power off the VM&lt;br /&gt;
* Select the Virtual Machine &amp;gt; Settings.&lt;br /&gt;
* On the Hardware tab, select the virtual hard disk and click &#039;&#039;Remove&#039;&#039;.&lt;br /&gt;
* Click &#039;&#039;OK&#039;&#039; to save your changes.&lt;br /&gt;
&lt;br /&gt;
2. Add the Boot disk of the ova virtual machine to the vmx one.&lt;br /&gt;
* Identify the size of the boot disk of the ova virtual machine (will be needed on the step when navigating to boot disk)&lt;br /&gt;
* On the powered off VM, Select the Virtual Machine &amp;gt; Settings.&lt;br /&gt;
* On the Hardware tab, select the virtual hard disk and click &#039;&#039;Add&#039;&#039;.&lt;br /&gt;
* Select Use “an existing virtual disk” then click &#039;&#039;Next&#039;&#039;.&lt;br /&gt;
* Navigate to the boot disk of the ova Virtual machine then click &#039;&#039;next&#039;&#039;.&lt;br /&gt;
* Click &#039;&#039;Finish&#039;&#039;.&lt;br /&gt;
Now the vmx virtual machine should have the Fw version 12r2.&lt;br /&gt;
&lt;br /&gt;
The .ova version will be available also in V12r1 sr7&lt;br /&gt;
&lt;br /&gt;
=== IPVA does not run on Citrix Cloud Platform ===&lt;br /&gt;
Reportedly, the Citrix cloud platform - although based on VMware - cannot run the IPVA.  Amongst other issues, the platform does not allow 4 virtual disks, which are required for the IPVA.&lt;br /&gt;
&lt;br /&gt;
=== IPVA does not run on VCloud Air ===&lt;br /&gt;
VCloud Air apparently does not support the timekeeping mechanism required by the IPVA.&lt;br /&gt;
&lt;br /&gt;
[[User:Ckl|ckl]] 15:50, 30 November 2016 (CET) We have seen the IPVA v12r2 running on vCloud Air. Use the ova import.&lt;br /&gt;
&lt;br /&gt;
=== IPVA on ESX 6.5 ===&lt;br /&gt;
We have reports that the IPVA does not run properly on ESX 6.5.  The IPVA boots up properly but the clock does not run.  Running the .ova based variation available in v12r2 fixed the issue or edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
=== Administration: Avoid &#039;reboot&#039; Command. Use &#039;reset&#039; Command ===&lt;br /&gt;
Alwas use the &#039;reset&#039; command to restart an IPVA. &lt;br /&gt;
The &#039;reboot&#039; command makes sense only on physical applicances, where its purpose is to deploy a new bootcode by means of a forced watchdog trap. The resulting post-reboot state will be as if an unsolicited trap/crash had occurred.&lt;br /&gt;
&lt;br /&gt;
=== No Fault Tolerance Support from VMWare vSphere 6.5 ===&lt;br /&gt;
We have reports that VMWare vSphere 6.5 Fault Tolerance (FT) no longer works. For further information regarding this feature, please refer to the respective note in [[Howto:Implement_PBX_with_zero_downtime_using_IPVA_and_VMWare_Fault_Tolerance | Implement PBX with zero downtime using IPVA and VMWare Fault_Tolerance]].&lt;br /&gt;
&lt;br /&gt;
=== Voice Quality Issues ===&lt;br /&gt;
When dealing with media streams (e.g. for announcements), the IPVA needs to fulfil real-time processing requirements, for example to process RTP packets in a timely fashion.  To do so, the IPVA relies on the capabilities of the virtualization platform it runs on. &lt;br /&gt;
&lt;br /&gt;
It is therefore important to configure the platform so that it supports real-time applications best. If you experience voice quality or latency issues, consider &lt;br /&gt;
* to make sure that all of the IPVAs memory is &#039;&#039;reserved&#039;&#039; to the IPVA (&#039;&#039;Latency Sensitivity&#039;&#039; set to &#039;&#039;High&#039;&#039;)&lt;br /&gt;
* to guarantee exclusive PCPU access&lt;br /&gt;
This helps to reduce CPU halt/wake-up states.&lt;br /&gt;
&lt;br /&gt;
===Additional vCPUs may cause problems===&lt;br /&gt;
The Multi-Core functionality of version 13r2 is a beta functionality. Additional virtual CPUs(vCPUs) should not be utilized in production environments.&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
===Can The Emulated CompactFlash Be Increased In Size?===&lt;br /&gt;
Yes, from within the &#039;&#039;Edit Virtual Machine&#039;&#039; dialog. Doing so just increases the size of the virtual harddisk. The emulated CompactFlash must be formatted afterwards and accordingly to benefit from the increased size. That step can be administrated from &#039;&#039;Administration/Compact Flash/Format&#039;&#039;. Note: A recommendation for an upper size limit is not given.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;vSphere / vSphere Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. At first backup all of your files from CF card&amp;lt;br&amp;gt;&lt;br /&gt;
2. Shutdown the corresponding IPVA&amp;lt;br&amp;gt;&lt;br /&gt;
3. Choose &amp;quot;Properties&amp;quot; of the IPVA&amp;lt;br&amp;gt;&lt;br /&gt;
4. Delete &amp;quot;Harddrive 2&amp;quot; (Hardrive file xxx/xxx_1.vmdk)&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 hd-boot.vmdk  &amp;gt; xxx.vmdk&lt;br /&gt;
 hd-cf.vmdk    &amp;gt; xxx_1.vmdk&lt;br /&gt;
 hd-flash.vmdk &amp;gt; xxx_2.vmdk&lt;br /&gt;
 hd-dump.vmdk  &amp;gt; xxx_3.vmdk&lt;br /&gt;
&lt;br /&gt;
5. Create new harddrive&amp;lt;br&amp;gt;&lt;br /&gt;
6. Configure the required size&amp;lt;br&amp;gt;&lt;br /&gt;
7. As &amp;quot;Node of virtual device&amp;quot; select &amp;quot;IDE(0:1)&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
8. Start the IPVA.&amp;lt;br&amp;gt;&lt;br /&gt;
9. &amp;quot;Format&amp;quot; the CF Card and &amp;quot;mount&amp;quot; it (General/Compact-Flash/General)&lt;br /&gt;
&lt;br /&gt;
===What Is The Size Of the emulated Flash Storage on the IPVA?===&lt;br /&gt;
The virtual flash storage used to store configuration file of the IPVA and LDAP directory of the PBX is defined with 64 MB and can not be changed. This is two times more than on IP6010. The VMDK-File hd-flash.vmdk is allocated with 100 MB, because VMWare can not handle smaller virtual disks.&lt;br /&gt;
&lt;br /&gt;
===What Is The Size Of the Flash Directory on the IPVA?===&lt;br /&gt;
As noted above, the virtual flash memory on the IPVA is fixed to a size of 64MB.  Most of the flash is used by the &#039;&#039;flash directory&#039;&#039; (FLASHDIR0) which amongst other things provides storage for PBX objects.&lt;br /&gt;
&lt;br /&gt;
The size of the flash directory depends on the available RAM. The maximum of 900 segments á 64KB, i.e. ~56MB, is available if 192MB or more RAM is available. If less RAM is available, the size of the flash directory is decreased accordingly.  For this reason, it is unsafe to reduce RAM size in a given IPVA, as the flash directory size may be decreased so that objects from the flash directory get lost.&lt;br /&gt;
&lt;br /&gt;
The easiest method to see how much flash directory space is available is to investigate the boot trace. For the standard configuration of 64MB the respective trace output is going to look as follows and informs about a size of 14MB:&lt;br /&gt;
 &lt;br /&gt;
 0:0000:081:4 - start flashdir FLASHDIR0&lt;br /&gt;
 0:0000:081:4 - fdir: segments=901-&amp;gt;224(14.0MB)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===How Much RAM Is Required Per IPVA Instance?===&lt;br /&gt;
Since 12r2sr27/13r1sr5 the downloadable virtual appliance comes preconfigured with 256MB RAM. This amount is seen as a good trade-off for the majority of all installations.&lt;br /&gt;
The RAM-size can be administrated by VMware-means.&lt;br /&gt;
&lt;br /&gt;
===What Is The Maximum Amount Of RAM?===&lt;br /&gt;
The maximum meaningful RAM setting is 3GB. Memory space beyond that limit will be left unused. Assigning more than 3GB to an IPVA instance doesn&#039;t provide any benefit.&lt;br /&gt;
&lt;br /&gt;
===Why Does &#039;&#039;General/Info/DRAM&#039;&#039; Show Less Than the Configured Memory?===&lt;br /&gt;
Not all of the configured memory is available to the IPVA. E.g. a bit of memory is occupied by the VMM&amp;lt;ref&amp;gt;Virtual Machine Monitor: A component belonging to the virtualization platform&amp;lt;/ref&amp;gt;. The indicator &#039;&#039;General/Info/DRAM&#039;&#039; displays the memory available to the IPVA and is truncated down to a whole number. A boot-trace reveals a bit more about IPVA-available memory as shown in the following excerpt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
0:0000:030:4 - Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz&lt;br /&gt;
0:0000:030:4 - mem(64946176)=61.93MB ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How Many IPVA Instances Are Possible Per Host?===&lt;br /&gt;
There&#039;s no worst-case estimate available. For a best-case calculation, &lt;br /&gt;
*see [http://www.vmware.com/pdf/vsphere4/r41/vsp_41_config_max.pdf  Configuration Maximums VMware vSphere 4.1]&lt;br /&gt;
*see [[#How_Much_RAM_Is_Required_Per_IPVA_Instance.3F | How Much RAM Is Required Per IPVA Instance?]]&lt;br /&gt;
Additional preformance reflections&lt;br /&gt;
*see [[HOWTO:A_rough_estimate_of_IPVA_Performance | A rough estimate of IPVA Performance]]&lt;br /&gt;
&lt;br /&gt;
===How do I perform a factory reset?===&lt;br /&gt;
&lt;br /&gt;
replace the 3rd disk, served on IDE 1:0, named hd-flash.vmdk with an empty disk:&lt;br /&gt;
&lt;br /&gt;
[[Image:VM_Settings.png]]&lt;br /&gt;
&lt;br /&gt;
1)download the IPVA and watch out for the file hd-flash.vmdk&lt;br /&gt;
&lt;br /&gt;
2)Power-off the IPVA instance&lt;br /&gt;
&lt;br /&gt;
3)Replace hd-flash.vmdk with the one downloaded in step 1). If on vsphere it may have been assigned a different name. Ensure it’s the one on IDE 1:0.&lt;br /&gt;
&lt;br /&gt;
4)Power-on the IPVA instance&lt;br /&gt;
&lt;br /&gt;
===What About VMware Tools?===&lt;br /&gt;
VMware Tools are not supported.&lt;br /&gt;
&lt;br /&gt;
===What Is The Console Good For?===&lt;br /&gt;
The console is a remains of the early development phase. It resembles the IP3000&#039;s serial console. It doesn&#039;t offer any convenience like command history or backspace funtionality. Nevertheless may the console be of help in exceptional situations where e.g. the required DHCP server isn&#039;t available for 1st-time configuration or in situations where the ip configuration was misconfigured. Thereby any command from a device&#039;s config is acceptable. &lt;br /&gt;
&lt;br /&gt;
For instance to configure the static IP address 1.2.3.4/24 on ETH0:&lt;br /&gt;
*Click into the console&lt;br /&gt;
*Press ENTER&lt;br /&gt;
*Enter credentials&lt;br /&gt;
*Enter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config change IP0 ETH0 /addr 192.168.0.10 /mask 255.255.255.0&lt;br /&gt;
config change IP0 RT0 /gateway 192.168.0.1&lt;br /&gt;
config change DHCP0 /mode off&lt;br /&gt;
config write&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since no backspace is offered it may become a daring task to enter a single line without typos. In case of a typo hit ENTER and input the same line again.&lt;br /&gt;
The keyboard layout is the US layout.&lt;br /&gt;
[[Image:Ip-via-console.png|center|thumb|200px|Console-edit of IP address]]&lt;br /&gt;
&lt;br /&gt;
Display the IP configuration for ETH0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config show IP0 ETH0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Display the DHCP configuration for ETH0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config show DHCP0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional the DNS-server(s) and the default gateway can be configured:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config change IP0 ETH0 /addr 1.2.3.4 /mask 255.255.255.0 /dns 8.8.8.8 /dns2 8.8.4.4&lt;br /&gt;
config change IP0 RT0 /gateway 1.2.3.254&lt;br /&gt;
config change DHCP0 /mode off&lt;br /&gt;
config write&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also some simple diagnostics (ping and traceroute) are possible via the console (output is given in the console):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mod cmd PING0 tracert 8.8.8.8&lt;br /&gt;
mod cmd PING0 ping 8.8.8.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resetting the entire FLASH space - &#039;&#039;&#039;Note, all configuration will get lost&#039;&#039;&#039;. this is similar method to the manufacturer reset method from above [[#How_do_I_perform_a_factory_reset.3F|How do I perform a factory reset?]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mod cmd FLASHMAN0 reset all&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of A Checksum Boot Error?===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
checksum wrong! Loading failed for image=IPVA    BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:ipva-crc-wrong.jpg|center|thumb|200px|Console displays CRC boot error]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&lt;br /&gt;
*Power-off the IPVA&lt;br /&gt;
*Replace the boot harddisk by a fresh one. The boot harddisk is the 1st hd(originally named &#039;&#039;hd-boot.vmdk&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This problem may occur on a system crash while a firmware update is taking place.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;NIC unavailable!&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIC unavailable!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:ipva-nic-unavailable.jpg|center|thumb|200px|Console displays &#039;&#039;NIC unavailable!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&lt;br /&gt;
*Power-off the IPVA&lt;br /&gt;
*Administrate by VMware means: Ensure the correct/expected type of network interface controller(NIC) is going to be offered by the hypervisor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IPVA offers driver support for:&lt;br /&gt;
*AMD NIC: Am79C970A PCnet-PCI II Single-Chip Full-Duplex Ethernet Controller&lt;br /&gt;
**a.k.a &#039;&#039;PCNet32&#039;&#039;&lt;br /&gt;
**a.k.a &#039;&#039;Vlance&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The AMD-NIC is kind of default. However, the NIC type may be overriden manually and accordingly within the configuration file ipva.vmx as follows&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ethernet0.virtualDev = &amp;quot;vlance&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This problem may occur after a VMware re-configuration of the network settings.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
perfcounter-not enabled!!!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:screenshot-ipva-perfcounter-nok.jpg|center|thumb|200px|Console displays &#039;&#039;perfcounter-not enabled!!!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
This problem is likely caused by an OVA-import of the IPVA. The appliance&#039;s configuration file &#039;&#039;ipva.vmx&#039;&#039; requires a VMware proprietary configuration line that&#039;s not specifiable within an OVA-file. &lt;br /&gt;
&lt;br /&gt;
The IPVA utilizes a VMware proprietary mechanism for its internal timekeeping&amp;lt;ref&amp;gt;Timekeeping in Virtual Machines http://www.vmware.com/pdf/vmware_timekeeping.pdf&amp;lt;/ref&amp;gt;. That mechanism is only available after adding the following line to the configuration file &#039;&#039;ipva.vmx&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
monitor_control.pseudo_perfctr = TRUE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If that line is not present, the hypervisor is going to throw a CPU exception. Hint: In vSphere a VMX-file can be edited under &#039;&#039;&#039;Edit Settings/Options/Advanced/General/Configuration Parameters&#039;&#039;&#039;&amp;lt;ref&amp;gt;vmware Labs - How to edit vmx file in ESXi vSphere: https://www.youtube.com/watch?v=ICICoq-maB0&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
*The vmx file should be edited after the installation of the IPVA.&lt;br /&gt;
*The vmx file should NOT be edited with Text editor (use vSphere as shown above)&lt;br /&gt;
*To our knowledge, a converter is always necessary for the installation with vmx.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;Loading failed for image=IPVA    BIN&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Loading failed for image=IPVA    BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Ipva-fw-load-failed.png|center|thumb|200px|Console displays &#039;&#039;Loading failed for image=IPVA    BIN&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
This problem is likely caused by a calculation fault within the boot-code. &lt;br /&gt;
*The solution requires a replacement of the boot disk hd-boot.vmdk. &lt;br /&gt;
**Download an IPVA package from on 11r2 sr22.&lt;br /&gt;
**Replace the 1st disk with the one from the downloaded package&lt;br /&gt;
&lt;br /&gt;
===Are Additional vCPUs useful?===&lt;br /&gt;
The Multi-Core functionality of version 13r2 is a beta functionality. Additional virtual CPUs(vCPUs) should not be utilized in production environments.&lt;br /&gt;
&lt;br /&gt;
===How To Replace The Boot Disk On vSphere?===&lt;br /&gt;
The recommended way is as follows:&lt;br /&gt;
*With ipva.ova deploy a fresh IPVA by means of &#039;&#039;&#039;File/Deploy OVF-Template...&#039;&#039;&#039; (de: &#039;&#039;&#039;Datei/OFV-Vorlage bereitstellen...&#039;&#039;&#039;) and follow instructions.&lt;br /&gt;
**Its use to just serve as a copy source.&lt;br /&gt;
*Power-Off the old IPVA.&lt;br /&gt;
*In the old IPVA remove the 1st disk on IDE 0:0.&lt;br /&gt;
*From the new IPVA copy the 1st harddisk(on IDE 0:0) towards the old IPVA&#039;s directory.&lt;br /&gt;
*In the old IPVA add the 1st disk on IDE 0:0.&lt;br /&gt;
*In the old IPVA confirm and start the machine&lt;br /&gt;
&lt;br /&gt;
===What do the counters mean under Interface/Ethx/Statistic?===&lt;br /&gt;
;rx-drop: Accumulates register CSR112 &amp;lt;ref&amp;gt;Command and Status Register&amp;lt;/ref&amp;gt; of the emulated chip AM79C970. CSR112: Missed Frame Count. An increase of this value indicates the IPVA was not able to process the network frames fast enough.&lt;br /&gt;
;ifInDiscards: Sum of rx-drop, frames dropped due to interface link not up, unsupported ethernet type, internal receive queue full, drop frames of different vlan, drop non vlan frames if vlan is configured&lt;br /&gt;
;rx-frame-blocked: Unsupported IP protocol&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
[[{{NAMESPACE}}:Licenses]]&lt;br /&gt;
&lt;br /&gt;
[[Howto:A_rough_estimate_of_IPVA_Performance | Howto:A_rough_estimate_of_IPVA_Performance]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept|Innovaphone Virtual Appliance]]&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=62746</id>
		<title>Reference13r3:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=62746"/>
		<updated>2022-07-14T14:49:27Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* DECT Phones Cannot Access Personal Directories */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 13r3&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Comma-separated files&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control viewability of an address book.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. This 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
===innovaphone-contacts===&lt;br /&gt;
The reqular app&lt;br /&gt;
===innovaphone-contacts-admin===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
===innovaphone-contacts-searchapi===&lt;br /&gt;
Provides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formated number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formated version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifiing the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*info&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innnovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
With version 13r3 it is now possible, to add, editing and delete contacts. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
Click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Sympbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Sympbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share globally&lt;br /&gt;
*Either remove all rules from a personal directory. Such a configuration corresponds to pre-13r3 capabilities. Up to 13r2 there weren&#039;t any visibility rules available.&lt;br /&gt;
*Or make every PBX user an active member of a group e.g. &amp;quot;everybody&amp;quot; and add a directory rule for that group &amp;quot;everybody&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. Enter the h323 name of the user, whom you want to give access (field &#039;&#039;&#039;Name&#039;&#039;&#039; in a user object) and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. Enter the name of the PBX group and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
As of Beta-Functionality: The Contacts Admin App allows to upload a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&amp;lt;code type=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[Reference13r1:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code type=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and App &#039;&#039;&#039;&#039;&#039;WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
If multiple files or multiple versions of a CSV file were uploaded, it might not be clear how to delete an old data set. Here is an example for how to accomplish a deletion of a particular data set related to an imported CSV file:&lt;br /&gt;
*2 Files were previously imported&lt;br /&gt;
**&#039;&#039;allcontacts.csv&#039;&#039;&lt;br /&gt;
**&#039;&#039;brs%20testimport.csv&#039;&#039;&lt;br /&gt;
*The file &#039;&#039;brs%20testimport.csv&#039;&#039; shall be deleted&lt;br /&gt;
*Hints&lt;br /&gt;
**Within the Contacts database, the table &#039;&#039;dbs&#039;&#039; contains the names of files once imported.&lt;br /&gt;
**The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Command &#039;psql&#039;. Printing the table &#039;dbs&#039;. Contains 2 file names.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |         uri&lt;br /&gt;
----+----------------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
  5 | brs%20testimport.csv&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
#Delete the file &amp;quot;brs%20testimport.csv&amp;quot; via its table-ID 5.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from dbs where id=5&amp;quot;&lt;br /&gt;
DELETE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Printing the table &#039;dbs&#039;. Contains 1 file name.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |       uri&lt;br /&gt;
----+-----------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Exporting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to export all contacts from the database. &lt;br /&gt;
This task can be accomplished by reading the main table &#039;&#039;entries&#039;&#039;, separate attributes by ; and store the result in a given csv-file.&lt;br /&gt;
The csv-file has to be located in a separate folder with appropriate access rights.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#create new folder export and grant access rights &lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; mkdir export&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; chmod 777 export&lt;br /&gt;
&lt;br /&gt;
#Retrieve all database entries, separate them by ; and store in file&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;copy entries to &#039;/mnt/sda2/home/admin/export/contacts.csv&#039; delimiter &#039;;&#039; CSV HEADER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated csv-file can be downloaded by use of an sftp-client (e.g. WinSCP) and login to the AP with admin credentials.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
== DECT Phones Cannot Access Personal Directories ==&lt;br /&gt;
DECT gateways do not support the mechanism required to query into directories with restricted access rules. Hence, DECT mobile phones cannot search into such directories.&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=62745</id>
		<title>Reference13r3:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=62745"/>
		<updated>2022-07-14T14:47:30Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Known Issues */ Added &amp;quot;DECT Phones Cannot Access Personal Directories&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 13r3&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Comma-separated files&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control viewability of an address book.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. This 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
===innovaphone-contacts===&lt;br /&gt;
The reqular app&lt;br /&gt;
===innovaphone-contacts-admin===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
===innovaphone-contacts-searchapi===&lt;br /&gt;
Provides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formated number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formated version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifiing the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*info&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innnovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
With version 13r3 it is now possible, to add, editing and delete contacts. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
Click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Sympbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Sympbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share globally&lt;br /&gt;
*Either remove all rules from a personal directory. Such a configuration corresponds to pre-13r3 capabilities. Up to 13r2 there weren&#039;t any visibility rules available.&lt;br /&gt;
*Or make every PBX user an active member of a group e.g. &amp;quot;everybody&amp;quot; and add a directory rule for that group &amp;quot;everybody&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. Enter the h323 name of the user, whom you want to give access (field &#039;&#039;&#039;Name&#039;&#039;&#039; in a user object) and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. Enter the name of the PBX group and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
As of Beta-Functionality: The Contacts Admin App allows to upload a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&amp;lt;code type=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[Reference13r1:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code type=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and App &#039;&#039;&#039;&#039;&#039;WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
If multiple files or multiple versions of a CSV file were uploaded, it might not be clear how to delete an old data set. Here is an example for how to accomplish a deletion of a particular data set related to an imported CSV file:&lt;br /&gt;
*2 Files were previously imported&lt;br /&gt;
**&#039;&#039;allcontacts.csv&#039;&#039;&lt;br /&gt;
**&#039;&#039;brs%20testimport.csv&#039;&#039;&lt;br /&gt;
*The file &#039;&#039;brs%20testimport.csv&#039;&#039; shall be deleted&lt;br /&gt;
*Hints&lt;br /&gt;
**Within the Contacts database, the table &#039;&#039;dbs&#039;&#039; contains the names of files once imported.&lt;br /&gt;
**The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Command &#039;psql&#039;. Printing the table &#039;dbs&#039;. Contains 2 file names.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |         uri&lt;br /&gt;
----+----------------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
  5 | brs%20testimport.csv&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
#Delete the file &amp;quot;brs%20testimport.csv&amp;quot; via its table-ID 5.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from dbs where id=5&amp;quot;&lt;br /&gt;
DELETE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Printing the table &#039;dbs&#039;. Contains 1 file name.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |       uri&lt;br /&gt;
----+-----------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Exporting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to export all contacts from the database. &lt;br /&gt;
This task can be accomplished by reading the main table &#039;&#039;entries&#039;&#039;, separate attributes by ; and store the result in a given csv-file.&lt;br /&gt;
The csv-file has to be located in a separate folder with appropriate access rights.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#create new folder export and grant access rights &lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; mkdir export&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; chmod 777 export&lt;br /&gt;
&lt;br /&gt;
#Retrieve all database entries, separate them by ; and store in file&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;copy entries to &#039;/mnt/sda2/home/admin/export/contacts.csv&#039; delimiter &#039;;&#039; CSV HEADER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated csv-file can be downloaded by use of an sftp-client (e.g. WinSCP) and login to the AP with admin credentials.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
== DECT Phones Cannot Access Personal Directories ==&lt;br /&gt;
DECT gateways do not support the mechanism required to query into directories with restricted access rules.&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=62565</id>
		<title>Reference13r3:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=62565"/>
		<updated>2022-07-04T13:16:00Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Sharing of Address Book */ Added: Sharing of Address Book/Share globally&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 13r3&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Comma-separated files&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control viewability of an address book.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. This 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
===innovaphone-contacts===&lt;br /&gt;
The reqular app&lt;br /&gt;
===innovaphone-contacts-admin===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
===innovaphone-contacts-searchapi===&lt;br /&gt;
Provides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formated number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formated version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifiing the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*info&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innnovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
With version 13r3 it is now possible, to add, editing and delete contacts. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
Click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Sympbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Sympbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share globally&lt;br /&gt;
*Either remove all rules from a personal directory. Such a configuration corresponds to pre-13r3 capabilities. Up to 13r2 there weren&#039;t any visibility rules available.&lt;br /&gt;
*Or make every PBX user an active member of a group e.g. &amp;quot;everybody&amp;quot; and add a directory rule for that group &amp;quot;everybody&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. Enter the h323 name of the user, whom you want to give access (field &#039;&#039;&#039;Name&#039;&#039;&#039; in a user object) and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. Enter the name of the PBX group and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
As of Beta-Functionality: The Contacts Admin App allows to upload a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&amp;lt;code type=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[Reference13r1:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code type=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and App &#039;&#039;&#039;&#039;&#039;WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
If multiple files or multiple versions of a CSV file were uploaded, it might not be clear how to delete an old data set. Here is an example for how to accomplish a deletion of a particular data set related to an imported CSV file:&lt;br /&gt;
*2 Files were previously imported&lt;br /&gt;
**&#039;&#039;allcontacts.csv&#039;&#039;&lt;br /&gt;
**&#039;&#039;brs%20testimport.csv&#039;&#039;&lt;br /&gt;
*The file &#039;&#039;brs%20testimport.csv&#039;&#039; shall be deleted&lt;br /&gt;
*Hints&lt;br /&gt;
**Within the Contacts database, the table &#039;&#039;dbs&#039;&#039; contains the names of files once imported.&lt;br /&gt;
**The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Command &#039;psql&#039;. Printing the table &#039;dbs&#039;. Contains 2 file names.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |         uri&lt;br /&gt;
----+----------------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
  5 | brs%20testimport.csv&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
#Delete the file &amp;quot;brs%20testimport.csv&amp;quot; via its table-ID 5.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from dbs where id=5&amp;quot;&lt;br /&gt;
DELETE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Printing the table &#039;dbs&#039;. Contains 1 file name.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |       uri&lt;br /&gt;
----+-----------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Exporting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to export all contacts from the database. &lt;br /&gt;
This task can be accomplished by reading the main table &#039;&#039;entries&#039;&#039;, separate attributes by ; and store the result in a given csv-file.&lt;br /&gt;
The csv-file has to be located in a separate folder with appropriate access rights.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#create new folder export and grant access rights &lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; mkdir export&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; chmod 777 export&lt;br /&gt;
&lt;br /&gt;
#Retrieve all database entries, separate them by ; and store in file&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;copy entries to &#039;/mnt/sda2/home/admin/export/contacts.csv&#039; delimiter &#039;;&#039; CSV HEADER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated csv-file can be downloaded by use of an sftp-client (e.g. WinSCP) and login to the AP with admin credentials.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=62562</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=62562"/>
		<updated>2022-07-04T09:49:01Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Latest News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://get.anydesk.com/PK8coqHH/AnyDesk.exe Download Anydesk]&lt;br /&gt;
&lt;br /&gt;
== Before you try to use this wiki ==&lt;br /&gt;
To get access &#039;&#039;&#039;[[Account_Creation|READ THIS FIRST]]&#039;&#039;&#039;, make sure you [[Special:Userlogin|log in]] and have [[Account_Creation|your account authorized]].&lt;br /&gt;
&lt;br /&gt;
You may then modify most of the articles and even add new ones.  We hope for a rich and useful platform for professional innovaphone users to emerge this way.&lt;br /&gt;
&lt;br /&gt;
To make sure you understand the terms of use, have a quick look at the [[innovaphone-wiki:About | legal stuff]].  But do not waste too much time there!  Instead, rather browse through the information provided.  There are various hopefully useful links in the sidebar on the left.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales-at-innovaphone-dot-com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 11:49, 4 July 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r2 product/13r2/firmware 136357 (sr 13) available | Version 13r2 Service Release 13]] is now available from the [https://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 11:49, 4 July 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r1 product/13r1/firmware 133116(sr 40) available | Version 13r1 Service Release 40]] is now available from the [https://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Msc|Msc]] 15:53, 1 June 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware_V13r3_product/13r3/firmware_137584_(beta1)_available | Version 13r3 Beta 1]] is now available from the [https://store.innovaphone.com/beta/download.htm beta store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:42, 11 May 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP73_1005_(3.1.6)_released | Wireless Handset Firmware IP73 1005 (3.1.6)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Teh|teh]] 07:40, 9 May 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r2 product/12r2/firmware 125850(sr 55) available | Version 12r2 Service Release 55]] is now available from the [https://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:40, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r1 product/12r1/firmware 121355(sr 46) available | Version 12r1 Service Release 46]] is now available from the [https://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Lmi|Lmi]] 12:34, 13 April 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V11r2 product/11r2/firmware 113800 (sr 60) available | Version 11r2 Service Release 60]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 11:22, 14 April 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Operator9 90246 (hotfix24) available | Operator9 hotfix24]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10313_(2.12.10)/IP65_10118_(2.12.10)_released | Wireless Handset Firmware IP64 10313 (2.12.10)/IP65 10118 (2.12.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 16 June 2021 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:iQM_Build_8029100_available | IQM Build 8029100 Hotfix34]] is now available from the [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:38, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP62_3040620_(6.2.3)_released | Wireless Handset Firmware IP62 3040620 (6.2.3)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:27, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM_Software_3130111_%284.0.0%29_released | WinPDM Software 3130111 (4.0.0)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Linux_Application_Platform_100271_(sr64)_available | Linux Application Platform V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Reporting_100271_(sr64)_available | innovaphone Reporting V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Fax_100271_(sr64)_available | innovaphone Fax V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Exchange_Calendar_Connector_100271_(sr64)_available | innovaphone Exchange Calendar Connector V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP61_3022811_(4.7.8)/IP63_3022912_(4.7.8)_released | Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_and_Management_Software_product/9.00/wireless_100037_%28hotfix19%29_available | Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 07:56, 9 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:App_Platform_build_90007_available | App Platform build 90007]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 02 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Recording_Build_121100_available | innovaphone Recording SR29 build 121100]] is now available from the [http://download.innovaphone.com/ice/10.00/#recording V10 download area].&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
{{Special:Newpages/8,namespace=Howto,namespace=Support,namespace=Reference,namespace=Reference7,namespace=Reference8}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
* [[Support:What are the Roadmap Documents? | Roadmaps ]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=62422</id>
		<title>Reference13r3:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=62422"/>
		<updated>2022-06-16T14:20:14Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Built-in LDAP Server */ Suffice to mention LDAP server is proprietary&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 13r3&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Comma-separated files&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control viewability of an address book.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. This 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:The 13r3 Contacts App works with the restriction, that the reverse lookup for private address books doesn&#039;t work. For full feature set, also upgrade the App Platform and PBX to 13r3.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
===innovaphone-contacts===&lt;br /&gt;
The reqular app&lt;br /&gt;
===innovaphone-contacts-admin===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
===innovaphone-contacts-searchapi===&lt;br /&gt;
Provides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formated number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formated version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifiing the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*info&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality. The purpose of the LDAP server functionality is to service innnovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
With version 13r3 it is now possible, to add, editing and delete contacts. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
Click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Sympbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Sympbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. Enter the h323 name of the user, whom you want to give access (field &#039;&#039;&#039;Name&#039;&#039;&#039; in a user object) and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. Enter the name of the PBX group and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
As of Beta-Functionality: The Contacts Admin App allows to upload a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&amp;lt;code type=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[Reference13r1:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code type=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and App &#039;&#039;&#039;&#039;&#039;WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
If multiple files or multiple versions of a CSV file were uploaded, it might not be clear how to delete an old data set. Here is an example for how to accomplish a deletion of a particular data set related to an imported CSV file:&lt;br /&gt;
*2 Files were previously imported&lt;br /&gt;
**&#039;&#039;allcontacts.csv&#039;&#039;&lt;br /&gt;
**&#039;&#039;brs%20testimport.csv&#039;&#039;&lt;br /&gt;
*The file &#039;&#039;brs%20testimport.csv&#039;&#039; shall be deleted&lt;br /&gt;
*Hints&lt;br /&gt;
**Within the Contacts database, the table &#039;&#039;dbs&#039;&#039; contains the names of files once imported.&lt;br /&gt;
**The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Command &#039;psql&#039;. Printing the table &#039;dbs&#039;. Contains 2 file names.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |         uri&lt;br /&gt;
----+----------------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
  5 | brs%20testimport.csv&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
#Delete the file &amp;quot;brs%20testimport.csv&amp;quot; via its table-ID 5.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from dbs where id=5&amp;quot;&lt;br /&gt;
DELETE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Printing the table &#039;dbs&#039;. Contains 1 file name.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |       uri&lt;br /&gt;
----+-----------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Exporting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to export all contacts from the database. &lt;br /&gt;
This task can be accomplished by reading the main table &#039;&#039;entries&#039;&#039;, separate attributes by ; and store the result in a given csv-file.&lt;br /&gt;
The csv-file has to be located in a separate folder with appropriate access rights.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#create new folder export and grant access rights &lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; mkdir export&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; chmod 777 export&lt;br /&gt;
&lt;br /&gt;
#Retrieve all database entries, separate them by ; and store in file&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;copy entries to &#039;/mnt/sda2/home/admin/export/contacts.csv&#039; delimiter &#039;;&#039; CSV HEADER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated csv-file can be downloaded by use of an sftp-client (e.g. WinSCP) and login to the AP with admin credentials.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
* [[Support:Forward_search_shows_no_result | Forward Search shows &amp;quot;no result&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=62187</id>
		<title>Reference13r3:Concept App Service Contacts</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Service_Contacts&amp;diff=62187"/>
		<updated>2022-05-24T09:56:24Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: &amp;quot;AP&amp;quot; =&amp;gt; &amp;quot;App Platform&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
{{FIXME|reason=This product is in the beta phase and is not yet finished}}&lt;br /&gt;
&lt;br /&gt;
= Applies To =&lt;br /&gt;
* App Contacts version 13r3&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
The App Service Contacts is an App Service which can be installed on an innovaphone App Platform. It is used for information retrieval of a database of contact entries, as well as maintaining personal contact books.&lt;br /&gt;
&lt;br /&gt;
Inside Contacts, personal and general entries can be searched (forward lookup) or be used to resolve incoming numbers to their respective name (reverse lookup).&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
*Import: Comma-separated files&lt;br /&gt;
*Database for contact entries: A user interface for retrieval purposes is available. &lt;br /&gt;
*API: Search API for other apps&lt;br /&gt;
*Edit Functionality: Contact entries are editable.&lt;br /&gt;
*Personal Address Book: Every user can maintain one or more personal address books.&lt;br /&gt;
*Access Right Management: Owners can maintain access privileges for single users or even groups of users, in order to control viewability of an address book.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
innovaphone PBX and App Platform from on version 13r3.&lt;br /&gt;
==Upgrade Considerations==&lt;br /&gt;
As always, don&#039;t forget to backup an existing App Platform in prior. This 13r3 App Contacts does alter the underlying database scheme.&lt;br /&gt;
;13r3 App on 13r1 App Platform, 13r1 PBX:Doesn&#039;t work. This 13r3 Contacts App does not work on an 13r1 Application Platform/Environment.&lt;br /&gt;
;13r3 App on 13r2 App Platform, 13r2 PBX:This 13r3 Contacts App may be used to update an 13r2 App Contacts App.&lt;br /&gt;
&lt;br /&gt;
=Apps=&lt;br /&gt;
===innovaphone-contacts===&lt;br /&gt;
The reqular app&lt;br /&gt;
===innovaphone-contacts-admin===&lt;br /&gt;
Features a menu (top-right) to manually upload a CSV file&lt;br /&gt;
===innovaphone-contacts-searchapi===&lt;br /&gt;
Provides a search API to other apps, e.g. for the Phone App&lt;br /&gt;
&lt;br /&gt;
= Concept =&lt;br /&gt;
General contact entries and entries for personal directories are stored within the same database. With the table &#039;&#039;&#039;acl&#039;&#039;&#039; which is acting as an access control list, restricted views and edit rights for personal directories can be granted.&lt;br /&gt;
&lt;br /&gt;
This way, only the owner of a personal directory (and granted user or groups) can see the content.&lt;br /&gt;
&lt;br /&gt;
==Number handling==&lt;br /&gt;
In principle, two versions of a phone number are always stored in the contacts database. &lt;br /&gt;
;Original Number&lt;br /&gt;
:This is the unchanged number imported by the user. This version includes all decorative characters, spaces, etc. (eg. +49-(7031) 730090)&lt;br /&gt;
;Formated number&lt;br /&gt;
:A filter is applied to the original number before saving to remove all non-dialable characters. (This means that only &amp;lt;code&amp;gt;0-9,+,*,#&amp;lt;/code&amp;gt; remain after that) This formated version of the call number is saved in addition to the data set. (eg. +497031730090)&lt;br /&gt;
&lt;br /&gt;
If a number is searched for (reverse lookup), the cleaned version is searched for. Thus, it does not matter which decorative characters or formats are imported.&lt;br /&gt;
If an entry is displayed to the user, the originally entered call number (incl. decoration characters) is displayed.&lt;br /&gt;
&lt;br /&gt;
It is therefore best practice to import only international format numbers (Decorations can be imported as they will be removed anyway), as the PBX always converts the number into the international format for a reverse lookup, if the [[Reference13r1:Concept_Number_Adjustments_%28Dialing_Location%29 |dialing location]] was configured correct.&lt;br /&gt;
&lt;br /&gt;
==Assign unique IDs for contacts entries==&lt;br /&gt;
It is recommended to upload CSV files with an additional column &#039;&#039;extAnchor&#039;&#039;. The column extAnchor allows to identify individual entries uniquely and independent of renaming operations. The column &#039;&#039;extAnchor&#039;&#039; is supposed to contain an external unique database id, alike a guid. If &#039;&#039;extAnchor&#039;&#039; was provided the import procedure will perform an UPDATE of previously existing entries, instead of deleting and re-INSERTing the entries. Entries pinned on home are going to remain functional.&lt;br /&gt;
&lt;br /&gt;
==List of Attributes==&lt;br /&gt;
The list of currently available attributes for a contacts entry follows:&lt;br /&gt;
;extAnchor&lt;br /&gt;
: unique id identifiing the entry within the database&lt;br /&gt;
;givenname&lt;br /&gt;
:First name&lt;br /&gt;
;sn&lt;br /&gt;
:Surname/Family name&lt;br /&gt;
;company&lt;br /&gt;
:Corporation&lt;br /&gt;
;displayname&lt;br /&gt;
:Name to be displayed&lt;br /&gt;
;email&lt;br /&gt;
:e.g. &#039;&#039;example@example.com&#039;&#039;&lt;br /&gt;
;telephonenumber&lt;br /&gt;
:Internationalized land-line telephone number, e.g.&#039;&#039; +49 7031 730090&#039;&#039;&lt;br /&gt;
;mobile&lt;br /&gt;
:Internationalized mobile telephone number&lt;br /&gt;
;homephone&lt;br /&gt;
:Internationalized home phone number&lt;br /&gt;
;facsimiletelephonenumber&lt;br /&gt;
:Internationalized fax number&lt;br /&gt;
;city&lt;br /&gt;
:City/Town, e.g. &#039;&#039;Milano&#039;&#039;&lt;br /&gt;
;street&lt;br /&gt;
;postalcode&lt;br /&gt;
;state&lt;br /&gt;
:Federal state, e.g. some US states: &#039;&#039;Ca, Wa, Fl&#039;&#039; &lt;br /&gt;
;country&lt;br /&gt;
:e.g. &#039;&#039;Deutschland, Italia&#039;&#039;&lt;br /&gt;
;privatecity&lt;br /&gt;
:Home address&lt;br /&gt;
;privatestreet&lt;br /&gt;
;privatepostalcode&lt;br /&gt;
;privatestate&lt;br /&gt;
;privatecountry&lt;br /&gt;
;title&lt;br /&gt;
:Academic title&lt;br /&gt;
;position&lt;br /&gt;
:Position within company, department&lt;br /&gt;
;department&lt;br /&gt;
;description&lt;br /&gt;
:Common description&lt;br /&gt;
;roomnumber&lt;br /&gt;
;info&lt;br /&gt;
:Common info&lt;br /&gt;
;url&lt;br /&gt;
:Company URL&lt;br /&gt;
;sip&lt;br /&gt;
:Dialable SIP address&lt;br /&gt;
&lt;br /&gt;
==List of Text-Indexable Attributes==&lt;br /&gt;
Attributes to be considered for the full-text index&lt;br /&gt;
*cn&lt;br /&gt;
*sn&lt;br /&gt;
*givenname&lt;br /&gt;
*company&lt;br /&gt;
*displayname&lt;br /&gt;
*info&lt;br /&gt;
*city&lt;br /&gt;
*street&lt;br /&gt;
*postalcode&lt;br /&gt;
*country&lt;br /&gt;
*state&lt;br /&gt;
*private_city&lt;br /&gt;
*private_street&lt;br /&gt;
*private_postalcode&lt;br /&gt;
*private_country&lt;br /&gt;
*private_state&lt;br /&gt;
*title&lt;br /&gt;
*position&lt;br /&gt;
*department&lt;br /&gt;
*description&lt;br /&gt;
*roomnumber&lt;br /&gt;
*sip&lt;br /&gt;
&lt;br /&gt;
==Built-in LDAP Server==&lt;br /&gt;
The App incorporates a proprietary LDAP server functionality, which is neither commercial-grade nor full-fledged. The purpose of the LDAP server functionality is to service innnovaphone LDAP clients, such as desk phones.&lt;br /&gt;
The LDAP server only supports a proprietary search by means of a meta attribute&amp;lt;ref&amp;gt;Meta attribute: Here an attribute with a special meaning and that is non-physical, not existing within the database&amp;lt;/ref&amp;gt;, whereby LDAP is just utilized as a transport vehicle for a user&#039;s search input one-to-one.&lt;br /&gt;
*E.g. a user searching for &#039;&#039;John Doe innovaphone&#039;&#039;&lt;br /&gt;
**Possible user input &#039;&#039;jo do inno&#039;&#039;&lt;br /&gt;
**Resulting LDAP filter &#039;&#039;(metaSearchText=jo do inno)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Sample Phone Configuration, innovaphone===&lt;br /&gt;
Phone/User-X/Directories/External LDAP Server&lt;br /&gt;
;Enable: Active&lt;br /&gt;
;Use TLS: Active&lt;br /&gt;
;Server: &amp;lt;host adddress of App Platform&amp;gt;&lt;br /&gt;
;Port: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;Username,Pw: &amp;lt;Credentials for LDAP Bind operation&amp;gt;&lt;br /&gt;
;Search Base: &#039;&#039;dc=entries&#039;&#039;&lt;br /&gt;
;Mode: &amp;lt;can be left on &amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
;Object Filter: &amp;lt;leave empty&amp;gt;&lt;br /&gt;
;Sort Results: Inactive&lt;br /&gt;
;Name Attributes: &#039;&#039;givenName,sn,company&#039;&#039;&lt;br /&gt;
;Number Attributes: &amp;lt;can be left empty&amp;gt;&lt;br /&gt;
;H323 ID Attribute:&#039;&#039; sip&#039;&#039;&lt;br /&gt;
;Detail Attributes: &#039;&#039;title,company,street,postalCode,city,country,email,url&#039;&#039;&lt;br /&gt;
;Meta Name Attribute: &#039;&#039;metaSearchText&#039;&#039;&lt;br /&gt;
;Meta Number Attribute: &#039;&#039;metaSearchNumber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Personal Address Book Details =&lt;br /&gt;
With version 13r3 it is now possible, to add, editing and delete contacts. It is also possible to create and maintain personal address book(s), as well as share them with other users or whole user groups.&lt;br /&gt;
&lt;br /&gt;
Only user/groups with sufficient rights, will be able to see other address books. An Access control list (acl) is used, to control these rights. &lt;br /&gt;
&lt;br /&gt;
Groups correspond to PBX-groups. The Contacts App gets to know only active PBX-group memberships.&lt;br /&gt;
&lt;br /&gt;
By default, only the user who created an address book, is able to see the content.&lt;br /&gt;
&lt;br /&gt;
==Maintain a Personal Address Book==&lt;br /&gt;
;Creating a Personal Address Book&lt;br /&gt;
Click on the burger menu in the top right corner inside the Contacts-App, and there on the &#039;&#039;&#039;&amp;quot;Directories&amp;quot;&#039;&#039;&#039;. Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Sympbol, choose a suitable name and confirm your name via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039; button. A new address book is created.&lt;br /&gt;
;Adding a new contact&lt;br /&gt;
Click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-Sympbol in the top right corner inside the Contacts-App and select an address book, where you want the contact to be stored in. Now fill in the contact information (the fields &#039;&#039;&amp;quot;name&amp;quot;&#039;&#039; and &#039;&#039;&amp;quot;last name&amp;quot;&#039;&#039; &#039;&#039;&#039;have to be filled&#039;&#039;&#039;) and save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button.&lt;br /&gt;
;Editing an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, click on the entry you want to edit and after your change, save it via &#039;&#039;&#039;&amp;quot;Save&amp;quot;&#039;&#039;&#039;-button on the bottom.&lt;br /&gt;
;Delete an existing contact&lt;br /&gt;
Search for the contact you want to edit via the search box inside the Contacts-App. Click on the &#039;&#039;&#039;&amp;quot;Details&amp;quot;&#039;&#039;&#039;-field on the right of the contact entry. Now click on the bottom on the &#039;&#039;&#039;&amp;quot;Edit&amp;quot;&#039;&#039;&#039;-button, and on the &#039;&#039;&#039;&amp;quot;trashcan&amp;quot;&#039;&#039;&#039;-symbol at the top. After confirmation, the entry is deleted.&lt;br /&gt;
&lt;br /&gt;
==Sharing of Address Book==&lt;br /&gt;
;Share with single user(s)&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;User&amp;quot;&#039;&#039;&#039; as type. Enter the h323/sip name of the user, whom you want to give access (field &#039;&#039;&#039;Name&#039;&#039;&#039; in a user object) and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Share with a group&lt;br /&gt;
Click on the menu in the top right corner inside the Contacts-App, click on &#039;&#039;&#039;&amp;quot;directories&amp;quot;&#039;&#039;&#039; and select a directory, you want to share.&lt;br /&gt;
&lt;br /&gt;
Now click on the &#039;&#039;&#039;&amp;quot;+&amp;quot;&#039;&#039;&#039;-symbol and select &#039;&#039;&#039;&amp;quot;Group&amp;quot;&#039;&#039;&#039; as type. Enter the name of the PBX group and select either if the user should have admin-rights or not. Now click on &#039;&#039;&#039;Ok&#039;&#039;&#039; and submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
&lt;br /&gt;
;Revoke of granted rights&lt;br /&gt;
You can also revoke previous granted rights by just clicking on the user/group at the access control list, and click on the &#039;&#039;&#039;trashcan&#039;&#039;&#039; symbol. Now submit your change with another click on &#039;&#039;&#039;Ok&#039;&#039;&#039;-button.&lt;br /&gt;
==Upload a new Directory==&lt;br /&gt;
As of Beta-Functionality: The Contacts Admin App allows to upload a CSV file as known from the 13r2 version (&#039;&#039;&#039;Hamburger/Import&#039;&#039;&#039;). In the course of an upload operation a new directory will be created. The newly assigned directory name will be the name of the CSV file.&lt;br /&gt;
After uploading the visibility setting of the new directory should be administrated as stated before under [[#Sharing_of_Address_Book|Sharing of Address Book]]&lt;br /&gt;
&lt;br /&gt;
==Terminology==&lt;br /&gt;
;ACL: Access control list. Refers the database table &#039;&#039;acl&#039;&#039; and rows/entries therein.&lt;br /&gt;
;Directory: Refers the database table &#039;&#039;dbs&#039;&#039; and rows/entries therein. All contact entries referencing a &#039;&#039;dbs&#039;&#039;-row make up the content of a directory.&lt;br /&gt;
;Address Book: Synonymous with &#039;&#039;Directory&#039;&#039;&lt;br /&gt;
;Contacts Admin: A user utilizing the Contacts Admin App (via App URL, ending with ../innovaphone-contacts-admin)&lt;br /&gt;
;Directory Admin: A user entitled the admin right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
;Directory User/Viewer: A user entitled the viewing right for a directory. Either by user-wise or by group-wise ACL entry.&lt;br /&gt;
&lt;br /&gt;
==Database Changes==&lt;br /&gt;
Three tables realize the functionality for personal directories.&lt;br /&gt;
*Table &#039;&#039;&#039;dbs&#039;&#039;&#039;. Each row represents a directory. Two new columns &#039;&#039;displayname, sip&#039;&#039; where added.&lt;br /&gt;
**&#039;&#039;&#039;displayname&#039;&#039;&#039; Name display.&lt;br /&gt;
**&#039;&#039;&#039;sip&#039;&#039;&#039; Creator&#039;s sip name, if available.&lt;br /&gt;
*Table &#039;&#039;&#039;acl&#039;&#039;&#039;.New table acting as access control list. Each row references a directory as listed by table &#039;&#039;dbs&#039;&#039; and is going to grant view- and admin-right to a specific user or group. &lt;br /&gt;
**&#039;&#039;&#039;dbsid&#039;&#039;&#039; Reference into table dbs.&lt;br /&gt;
**&#039;&#039;&#039;name&#039;&#039;&#039; The name of a user or a group.&lt;br /&gt;
**&#039;&#039;&#039;acltype&#039;&#039;&#039; A numeric value: user(0), group(1)&lt;br /&gt;
**&#039;&#039;&#039;admin&#039;&#039;&#039; Granting edit right: admin(true), non-admin(false)&lt;br /&gt;
*Table &#039;&#039;&#039;entries&#039;&#039;&#039;. Each row within this pre-exisisting table represents a contact entry. The column &#039;&#039;dbsid&#039;&#039; informs about whether an entry belongs to a specific directory.&amp;lt;code type=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
#Excerpt for an additional directory &#039;&#039;Persönliches Verzeichnis: mst&#039;&#039; with one contact entry.&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |                         uri                          |          displayname           | sip&lt;br /&gt;
----+------------------------------------------------------+--------------------------------+-----&lt;br /&gt;
  7 | file:///4eaae395-9971-40fb-9a05-dfae1d023f12?sip=mst | Persönliches Verzeichnis: mst  | mst      # Specification for directory (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from acl&amp;quot;&lt;br /&gt;
 id | dbsid | name | acltype | admin&lt;br /&gt;
----+-------+------+---------+-------&lt;br /&gt;
  5 |     7 | mst  |       0 | t              #user &#039;mst&#039; can view and edit directory with dbsid=7 (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select sn,givenname,company,id,dbsid from entries where dbsid=7&amp;quot;&lt;br /&gt;
    sn    | givenname |   company    |  id   | dbsid&lt;br /&gt;
----------+-----------+--------------+-------+-------&lt;br /&gt;
 Duck     | Dagobert  | Duck Corp.   | 51394 |     7   # main table entries contains 1 entry belonging to (&#039;Persönliches Verzeichnis: mst&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reverse Number Lookup for Personal Directories==&lt;br /&gt;
Queries into directories are access-checked by looking-up and enforcing ACL-rules. The information on whose name is being queried and which group memberships are taking effect is needed for this process.&lt;br /&gt;
&lt;br /&gt;
Websocket connections to the Contacts App service carry those infos within the SDK method &#039;&#039;AppWebsocketConnectComplete()&#039;&#039;. &lt;br /&gt;
LDAP connections pass this information within a proprietary LDAP control together with an LDAP searchRequest message. &lt;br /&gt;
&lt;br /&gt;
The PBX&#039;s centralized Reverse Lookup service (see &#039;&#039;PBX/Config/General/Reverse Lookup URL&#039;&#039;) does support this mechanism.  That is, for every LDAP searchRequest the affected user&#039;s name and active group memberships are going to be sent towards the Contacts App&#039;s LDAP server.&lt;br /&gt;
&lt;br /&gt;
See also [[Reference13r1:Concept_Reverse_Lookup|concept article on reverse lookup]].&lt;br /&gt;
&lt;br /&gt;
=Upload Data by HTTP Post=&lt;br /&gt;
A CSV file can be uploaded by means of an HTTP POST request. &lt;br /&gt;
The following powershell script aims to demonstrate this procedure with the help of CURL&amp;lt;ref&amp;gt;For a windows distribution: e.g.: https://curl.haxx.se/download.html &amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;CURL is recommended(rather required), because it supports the simple POST mechanism with an initial tentative POST with the data length of 0, in order to get through the authentication phase&amp;lt;/ref&amp;gt;&lt;br /&gt;
The required user and password content corresponds to the configuration underneath &#039;&#039;&#039;PBX Manager/AP Contacts/Configuration/User(HTTP Post)&#039;&#039;&#039; and &#039;&#039;&#039;Password(HTTP Post)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code type=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# csv.ps1&lt;br /&gt;
# Sample powershell script demonstrating how to HTTP POST a CSV file towards the Contacts App service.&lt;br /&gt;
# .\bin\curl must be present, e.g. from https://curl.haxx.se/download.html&lt;br /&gt;
# Examples:&lt;br /&gt;
# powershell -ExecutionPolicy Bypass -Command .\csv.ps1 -Dest 172.16.18.215 -File &amp;quot;.\myContacts.utf8&amp;quot; -User &amp;quot;contacts01&amp;quot; -Pw &amp;quot;pwd01&amp;quot; -Url &amp;quot;/example.com/contacts01/post/myContacts.utf8?op=csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
param(&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Destination host&amp;quot;)]&lt;br /&gt;
	[string]$Dest,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Name of file to be POSTed&amp;quot;)]&lt;br /&gt;
	[string]$File,	&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: User&amp;quot;)]&lt;br /&gt;
	[string]$User,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;Authentication: Password&amp;quot;)]&lt;br /&gt;
	[string]$Pw,&lt;br /&gt;
	[Parameter(Mandatory=$false, HelpMessage=&amp;quot;URL, e.g.: /example.com/contacts01/post/myContacts.csv?op=csv&amp;amp;xml-stats=true&amp;quot;)]&lt;br /&gt;
	[string]$Url&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Add-Type -AssemblyName System.Web&lt;br /&gt;
&lt;br /&gt;
$Uri = &amp;quot;http://&amp;quot; + $Dest + $Url&lt;br /&gt;
&lt;br /&gt;
function UploadToContacts {&lt;br /&gt;
	# Ensure file&#039;s there and has content&lt;br /&gt;
	if (!(Test-Path -Path $File)) {&lt;br /&gt;
		echo $File+&amp;quot; not downloaded!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	$lines = 0&lt;br /&gt;
	Get-Content $File |%{ $lines++ }&lt;br /&gt;
	echo &amp;quot;Lines of $File=$lines&amp;quot;&lt;br /&gt;
	if($lines -le 2) {&lt;br /&gt;
		echo &amp;quot;No Data to upload!&amp;quot;&lt;br /&gt;
		exit 1&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$auth = &amp;quot;${User}:${Pw}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;POSTing towards $Uri&amp;quot;&lt;br /&gt;
	.\bin\curl &amp;quot;--digest&amp;quot; -s -S --trace-time -u $auth -i -H &amp;quot;Content-Type:application/octet-stream&amp;quot; -X POST --data-binary &amp;quot;@${File}&amp;quot; &amp;quot;${Uri}&amp;quot;&lt;br /&gt;
	echo &amp;quot;POSTed towards $Dest&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$timeStart = Get-Date&lt;br /&gt;
echo &amp;quot;===Begin: ${timeStart} ===&amp;quot;&lt;br /&gt;
UploadToContacts&lt;br /&gt;
$timeEnd = Get-Date&lt;br /&gt;
echo &amp;quot;===End: ${timeEnd} ===&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== The URL ==&lt;br /&gt;
The first part of the URL (&#039;&#039;example.com/contacts01&#039;&#039;) is the &#039;&#039;Webserver path&#039;&#039; configured for the &#039;&#039;Contacts&#039;&#039; instance in the &#039;&#039;App Platform Manager&#039;&#039;. It must be followed by the literal &amp;lt;code&amp;gt;post&amp;lt;/code&amp;gt;. The last part (&#039;&#039;myContacts.csv&#039;&#039;) can be chosen freely. &lt;br /&gt;
&lt;br /&gt;
Note that the last part of the URL used to post the file (&#039;&#039;myContacts.csv&#039;&#039; in the example above) needs to be chose carefully.  &#039;&#039;Contacts&#039;&#039; will remember this name as source for each of the uploaded entries. When the file is posted again (that is, when a new POST using this last URL part is done), &#039;&#039;Contacts&#039;&#039; will first delete all existing entries previously uploaded with this name and then add the new ones.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
To collect debugging data, activate the &#039;&#039;&#039;&#039;&#039;App&#039;&#039;&#039;&#039;&#039; and App &#039;&#039;&#039;&#039;&#039;WebSocket&#039;&#039;&#039;&#039;&#039; trace options at the contacts instance on the App Platform Manager. Now reproduce the issue and save the logfile.&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting an uploaded File==&lt;br /&gt;
If multiple files or multiple versions of a CSV file were uploaded, it might not be clear how to delete an old data set. Here is an example for how to accomplish a deletion of a particular data set related to an imported CSV file:&lt;br /&gt;
*2 Files were previously imported&lt;br /&gt;
**&#039;&#039;allcontacts.csv&#039;&#039;&lt;br /&gt;
**&#039;&#039;brs%20testimport.csv&#039;&#039;&lt;br /&gt;
*The file &#039;&#039;brs%20testimport.csv&#039;&#039; shall be deleted&lt;br /&gt;
*Hints&lt;br /&gt;
**Within the Contacts database, the table &#039;&#039;dbs&#039;&#039; contains the names of files once imported.&lt;br /&gt;
**The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Command &#039;psql&#039;. Printing the table &#039;dbs&#039;. Contains 2 file names.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |         uri&lt;br /&gt;
----+----------------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
  5 | brs%20testimport.csv&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
#Delete the file &amp;quot;brs%20testimport.csv&amp;quot; via its table-ID 5.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from dbs where id=5&amp;quot;&lt;br /&gt;
DELETE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Printing the table &#039;dbs&#039;. Contains 1 file name.&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select * from dbs&amp;quot;&lt;br /&gt;
 id |       uri&lt;br /&gt;
----+-----------------&lt;br /&gt;
  1 | allcontacts.csv&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manually Deleting all Contacts==&lt;br /&gt;
Sometimes it may become necessary to delete all contacts from the database. This task can be accomplished by simply deleting the main table &#039;&#039;entries&#039;&#039;. The deletion will cascade from there into all sub-tables.&lt;br /&gt;
*The database name, here: &#039;&#039;innovaphone.com_contacts&#039;&#039; can be retrieved from the settings within in the App Manager for the Contacts App.&lt;br /&gt;
Establish an SSH-session by means of e.g. putty&amp;lt;ref&amp;gt;putty: https://putty.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;code type=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#Login&lt;br /&gt;
#===================================================================&lt;br /&gt;
login as: admin&lt;br /&gt;
Using keyboard-interactive authentication.&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#Elevate to super-user rights, Command &#039;su&#039;&lt;br /&gt;
#===================================================================&lt;br /&gt;
admin@app-platform|/mnt/sda2/home/admin&amp;gt; su&lt;br /&gt;
Password:&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
    94&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
#Delete&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;delete from entries *&amp;quot;&lt;br /&gt;
DELETE 94&lt;br /&gt;
&lt;br /&gt;
#List number of contacts in main table entries&lt;br /&gt;
#===================================================================&lt;br /&gt;
root@app-platform|/mnt/sda2/home/admin&amp;gt; psql -d &amp;quot;innovaphone.com_contacts&amp;quot; -c &amp;quot;select count(*) from entries&amp;quot;&lt;br /&gt;
 count&lt;br /&gt;
-------&lt;br /&gt;
     0&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Known Problems=== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* [[Support:Contacts_on_HomeScreen_can%27t_be_open_after_modification_on_ContactsAPP | Contacts on HomeScreen can&#039;t be open after modification on ContactsAPP]]&lt;br /&gt;
* [[Support:Contacts_Upload_Fails_From_Within_myApps_Launcher | Contacts Upload Fails From Within myApps Launcher]]&lt;br /&gt;
= Related =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61734</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61734"/>
		<updated>2022-04-14T09:22:46Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Latest News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://get.anydesk.com/PK8coqHH/AnyDesk.exe Download Anydesk]&lt;br /&gt;
&lt;br /&gt;
== Before you try to use this wiki ==&lt;br /&gt;
To get access &#039;&#039;&#039;[[Account_Creation|READ THIS FIRST]]&#039;&#039;&#039;, make sure you [[Special:Userlogin|log in]] and have [[Account_Creation|your account authorized]].&lt;br /&gt;
&lt;br /&gt;
You may then modify most of the articles and even add new ones.  We hope for a rich and useful platform for professional innovaphone users to emerge this way.&lt;br /&gt;
&lt;br /&gt;
To make sure you understand the terms of use, have a quick look at the [[innovaphone-wiki:About | legal stuff]].  But do not waste too much time there!  Instead, rather browse through the information provided.  There are various hopefully useful links in the sidebar on the left.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales-at-innovaphone-dot-com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Lmi|Lmi]] 12:34, 13 April 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r2 product/13r2/firmware 136345 (sr 11) available | Version 13r2 Service Release 11]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Lmi|Lmi]] 12:34, 13 April 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r1 product/13r1/firmware 133112(sr 38) available | Version 13r1 Service Release 38]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Lmi|Lmi]] 12:34, 13 April 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r2 product/12r2/firmware 125849(sr 54) available | Version 12r2 Service Release 54]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:40, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r1 product/12r1/firmware 121355(sr 46) available | Version 12r1 Service Release 46]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Lmi|Lmi]] 12:34, 13 April 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V11r2 product/11r2/firmware 113800 (sr 60) available | Version 11r2 Service Release 60]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 11:22, 14 April 2022 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Operator9 90246 (hotfix24) available | Operator9 hotfix24]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10313_(2.12.10)/IP65_10118_(2.12.10)_released | Wireless Handset Firmware IP64 10313 (2.12.10)/IP65 10118 (2.12.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP73_1004_(3.0.10)_released | Wireless Handset Firmware IP73 1004 (3.0.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 16 June 2021 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:iQM_Build_8029100_available | IQM Build 8029100 Hotfix34]] is now available from the [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 10:35, 18 February 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Operator9 90244 (hotfix23) available | Operator9 hotfix23]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:38, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP62_3040620_(6.2.3)_released | Wireless Handset Firmware IP62 3040620 (6.2.3)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:27, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM_Software_3130111_%284.0.0%29_released | WinPDM Software 3130111 (4.0.0)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:04, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10311_(2.11.4)/IP65_10117_(2.11.4)_released | Wireless Handset Firmware IP64 10311 (2.11.4)/IP65 10117 (2.11.4)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 09 December 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:IQM_Build_8028700_available | IQM Build 8028700 Hotfix33]] is now available from the [http://download.innovaphone.com/ice/8.00/#iqm V8 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Linux_Application_Platform_100271_(sr64)_available | Linux Application Platform V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Reporting_100271_(sr64)_available | innovaphone Reporting V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Fax_100271_(sr64)_available | innovaphone Fax V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Exchange_Calendar_Connector_100271_(sr64)_available | innovaphone Exchange Calendar Connector V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP61_3022811_(4.7.8)/IP63_3022912_(4.7.8)_released | Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_and_Management_Software_product/9.00/wireless_100037_%28hotfix19%29_available | Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 07:56, 9 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:App_Platform_build_90007_available | App Platform build 90007]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 02 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Recording_Build_121100_available | innovaphone Recording SR29 build 121100]] is now available from the [http://download.innovaphone.com/ice/10.00/#recording V10 download area].&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
{{Special:Newpages/8,namespace=Howto,namespace=Support,namespace=Reference,namespace=Reference7,namespace=Reference8}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
* [[Support:What are the Roadmap Documents? | Roadmaps ]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61117</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61117"/>
		<updated>2022-02-22T14:59:07Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Latest News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://get.anydesk.com/PK8coqHH/AnyDesk.exe Download Anydesk]&lt;br /&gt;
&lt;br /&gt;
== Before you try to use this wiki ==&lt;br /&gt;
To get access &#039;&#039;&#039;[[Account_Creation|READ THIS FIRST]]&#039;&#039;&#039;, make sure you [[Special:Userlogin|log in]] and have [[Account_Creation|your account authorized]].&lt;br /&gt;
&lt;br /&gt;
You may then modify most of the articles and even add new ones.  We hope for a rich and useful platform for professional innovaphone users to emerge this way.&lt;br /&gt;
&lt;br /&gt;
To make sure you understand the terms of use, have a quick look at the [[innovaphone-wiki:About | legal stuff]].  But do not waste too much time there!  Instead, rather browse through the information provided.  There are various hopefully useful links in the sidebar on the left.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales-at-innovaphone-dot-com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 15:59, 22 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r2 product/13r2/firmware 136330 (sr 9) available | Version 13r2 Service Release 9]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:51, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r2 product/12r2/firmware 125848(sr 53) available | Version 12r2 Service Release 53]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:47, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r1 product/13r1/firmware 133103(sr 36) available | Version 13r1 Service Release 36]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:40, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r1 product/12r1/firmware 121355(sr 46) available | Version 12r1 Service Release 46]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:37, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V11r2 product/11r2/firmware 113799 (sr 59) available | Version 11r2 Service Release 59]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10313_(2.12.10)/IP65_10118_(2.12.10)_released | Wireless Handset Firmware IP64 10313 (2.12.10)/IP65 10118 (2.12.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP73_1004_(3.0.10)_released | Wireless Handset Firmware IP73 1004 (3.0.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 16 June 2021 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:iQM_Build_8029100_available | IQM Build 8029100 Hotfix34]] is now available from the [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 10:35, 18 February 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Operator9 90244 (hotfix23) available | Operator9 hotfix23]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:38, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP62_3040620_(6.2.3)_released | Wireless Handset Firmware IP62 3040620 (6.2.3)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:27, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM_Software_3130111_%284.0.0%29_released | WinPDM Software 3130111 (4.0.0)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:04, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10311_(2.11.4)/IP65_10117_(2.11.4)_released | Wireless Handset Firmware IP64 10311 (2.11.4)/IP65 10117 (2.11.4)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 09 December 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:IQM_Build_8028700_available | IQM Build 8028700 Hotfix33]] is now available from the [http://download.innovaphone.com/ice/8.00/#iqm V8 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Linux_Application_Platform_100271_(sr64)_available | Linux Application Platform V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Reporting_100271_(sr64)_available | innovaphone Reporting V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Fax_100271_(sr64)_available | innovaphone Fax V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Exchange_Calendar_Connector_100271_(sr64)_available | innovaphone Exchange Calendar Connector V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP61_3022811_(4.7.8)/IP63_3022912_(4.7.8)_released | Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_and_Management_Software_product/9.00/wireless_100037_%28hotfix19%29_available | Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 07:56, 9 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:App_Platform_build_90007_available | App Platform build 90007]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 02 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Recording_Build_121100_available | innovaphone Recording SR29 build 121100]] is now available from the [http://download.innovaphone.com/ice/10.00/#recording V10 download area].&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
{{Special:Newpages/8,namespace=Howto,namespace=Support,namespace=Reference,namespace=Reference7,namespace=Reference8}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
* [[Support:What are the Roadmap Documents? | Roadmaps ]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61053</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61053"/>
		<updated>2022-02-14T16:51:34Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Latest News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://get.anydesk.com/PK8coqHH/AnyDesk.exe Download Anydesk]&lt;br /&gt;
&lt;br /&gt;
== Before you try to use this wiki ==&lt;br /&gt;
To get access &#039;&#039;&#039;[[Account_Creation|READ THIS FIRST]]&#039;&#039;&#039;, make sure you [[Special:Userlogin|log in]] and have [[Account_Creation|your account authorized]].&lt;br /&gt;
&lt;br /&gt;
You may then modify most of the articles and even add new ones.  We hope for a rich and useful platform for professional innovaphone users to emerge this way.&lt;br /&gt;
&lt;br /&gt;
To make sure you understand the terms of use, have a quick look at the [[innovaphone-wiki:About | legal stuff]].  But do not waste too much time there!  Instead, rather browse through the information provided.  There are various hopefully useful links in the sidebar on the left.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales-at-innovaphone-dot-com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:51, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r2 product/12r2/firmware 125848(sr 53) available | Version 12r2 Service Release 53]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:47, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r1 product/13r1/firmware 133103(sr 36) available | Version 13r1 Service Release 36]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:40, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r1 product/12r1/firmware 121355(sr 46) available | Version 12r1 Service Release 46]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:37, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V11r2 product/11r2/firmware 113799 (sr 59) available | Version 11r2 Service Release 59]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10313_(2.12.10)/IP65_10118_(2.12.10)_released | Wireless Handset Firmware IP64 10313 (2.12.10)/IP65 10118 (2.12.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP73_1004_(3.0.10)_released | Wireless Handset Firmware IP73 1004 (3.0.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 15:30, 17 January 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r2 product/13r2/firmware 136268 (sr 8) available | Version 13r2 Service Release 8]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 16 June 2021 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:iQM_Build_8029100_available | IQM Build 8029100 Hotfix34]] is now available from the [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 10:35, 18 February 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Operator9 90244 (hotfix23) available | Operator9 hotfix23]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:38, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP62_3040620_(6.2.3)_released | Wireless Handset Firmware IP62 3040620 (6.2.3)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:27, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM_Software_3130111_%284.0.0%29_released | WinPDM Software 3130111 (4.0.0)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:04, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10311_(2.11.4)/IP65_10117_(2.11.4)_released | Wireless Handset Firmware IP64 10311 (2.11.4)/IP65 10117 (2.11.4)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 09 December 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:IQM_Build_8028700_available | IQM Build 8028700 Hotfix33]] is now available from the [http://download.innovaphone.com/ice/8.00/#iqm V8 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Linux_Application_Platform_100271_(sr64)_available | Linux Application Platform V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Reporting_100271_(sr64)_available | innovaphone Reporting V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Fax_100271_(sr64)_available | innovaphone Fax V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Exchange_Calendar_Connector_100271_(sr64)_available | innovaphone Exchange Calendar Connector V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP61_3022811_(4.7.8)/IP63_3022912_(4.7.8)_released | Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_and_Management_Software_product/9.00/wireless_100037_%28hotfix19%29_available | Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 07:56, 9 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:App_Platform_build_90007_available | App Platform build 90007]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 02 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Recording_Build_121100_available | innovaphone Recording SR29 build 121100]] is now available from the [http://download.innovaphone.com/ice/10.00/#recording V10 download area].&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
{{Special:Newpages/8,namespace=Howto,namespace=Support,namespace=Reference,namespace=Reference7,namespace=Reference8}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
* [[Support:What are the Roadmap Documents? | Roadmaps ]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61051</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61051"/>
		<updated>2022-02-14T16:47:44Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Latest News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://get.anydesk.com/PK8coqHH/AnyDesk.exe Download Anydesk]&lt;br /&gt;
&lt;br /&gt;
== Before you try to use this wiki ==&lt;br /&gt;
To get access &#039;&#039;&#039;[[Account_Creation|READ THIS FIRST]]&#039;&#039;&#039;, make sure you [[Special:Userlogin|log in]] and have [[Account_Creation|your account authorized]].&lt;br /&gt;
&lt;br /&gt;
You may then modify most of the articles and even add new ones.  We hope for a rich and useful platform for professional innovaphone users to emerge this way.&lt;br /&gt;
&lt;br /&gt;
To make sure you understand the terms of use, have a quick look at the [[innovaphone-wiki:About | legal stuff]].  But do not waste too much time there!  Instead, rather browse through the information provided.  There are various hopefully useful links in the sidebar on the left.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales-at-innovaphone-dot-com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:47, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r1 product/13r1/firmware 133103(sr 36) available | Version 13r1 Service Release 36]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:40, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r1 product/12r1/firmware 121355(sr 46) available | Version 12r1 Service Release 46]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:37, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V11r2 product/11r2/firmware 113799 (sr 59) available | Version 11r2 Service Release 59]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10313_(2.12.10)/IP65_10118_(2.12.10)_released | Wireless Handset Firmware IP64 10313 (2.12.10)/IP65 10118 (2.12.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP73_1004_(3.0.10)_released | Wireless Handset Firmware IP73 1004 (3.0.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 15:30, 17 January 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r2 product/12r2/firmware 125847 (sr 52) available | Version 12r2 Service Release 52]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 15:30, 17 January 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r2 product/13r2/firmware 136268 (sr 8) available | Version 13r2 Service Release 8]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 16 June 2021 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:iQM_Build_8029100_available | IQM Build 8029100 Hotfix34]] is now available from the [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 10:35, 18 February 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Operator9 90244 (hotfix23) available | Operator9 hotfix23]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:38, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP62_3040620_(6.2.3)_released | Wireless Handset Firmware IP62 3040620 (6.2.3)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:27, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM_Software_3130111_%284.0.0%29_released | WinPDM Software 3130111 (4.0.0)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:04, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10311_(2.11.4)/IP65_10117_(2.11.4)_released | Wireless Handset Firmware IP64 10311 (2.11.4)/IP65 10117 (2.11.4)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 09 December 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:IQM_Build_8028700_available | IQM Build 8028700 Hotfix33]] is now available from the [http://download.innovaphone.com/ice/8.00/#iqm V8 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Linux_Application_Platform_100271_(sr64)_available | Linux Application Platform V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Reporting_100271_(sr64)_available | innovaphone Reporting V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Fax_100271_(sr64)_available | innovaphone Fax V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Exchange_Calendar_Connector_100271_(sr64)_available | innovaphone Exchange Calendar Connector V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP61_3022811_(4.7.8)/IP63_3022912_(4.7.8)_released | Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_and_Management_Software_product/9.00/wireless_100037_%28hotfix19%29_available | Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 07:56, 9 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:App_Platform_build_90007_available | App Platform build 90007]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 02 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Recording_Build_121100_available | innovaphone Recording SR29 build 121100]] is now available from the [http://download.innovaphone.com/ice/10.00/#recording V10 download area].&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
{{Special:Newpages/8,namespace=Howto,namespace=Support,namespace=Reference,namespace=Reference7,namespace=Reference8}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
* [[Support:What are the Roadmap Documents? | Roadmaps ]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61049</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61049"/>
		<updated>2022-02-14T16:40:37Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Latest News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://get.anydesk.com/PK8coqHH/AnyDesk.exe Download Anydesk]&lt;br /&gt;
&lt;br /&gt;
== Before you try to use this wiki ==&lt;br /&gt;
To get access &#039;&#039;&#039;[[Account_Creation|READ THIS FIRST]]&#039;&#039;&#039;, make sure you [[Special:Userlogin|log in]] and have [[Account_Creation|your account authorized]].&lt;br /&gt;
&lt;br /&gt;
You may then modify most of the articles and even add new ones.  We hope for a rich and useful platform for professional innovaphone users to emerge this way.&lt;br /&gt;
&lt;br /&gt;
To make sure you understand the terms of use, have a quick look at the [[innovaphone-wiki:About | legal stuff]].  But do not waste too much time there!  Instead, rather browse through the information provided.  There are various hopefully useful links in the sidebar on the left.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales-at-innovaphone-dot-com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:40, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r1 product/12r1/firmware 121355(sr 46) available | Version 12r1 Service Release 46]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:37, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V11r2 product/11r2/firmware 113799 (sr 59) available | Version 11r2 Service Release 59]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10313_(2.12.10)/IP65_10118_(2.12.10)_released | Wireless Handset Firmware IP64 10313 (2.12.10)/IP65 10118 (2.12.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP73_1004_(3.0.10)_released | Wireless Handset Firmware IP73 1004 (3.0.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 15:30, 17 January 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r2 product/12r2/firmware 125847 (sr 52) available | Version 12r2 Service Release 52]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 15:30, 17 January 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r1 product/13r1/firmware 133100 (sr 35) available | Version 13r1 Service Release 35]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 15:30, 17 January 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r2 product/13r2/firmware 136268 (sr 8) available | Version 13r2 Service Release 8]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 16 June 2021 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:iQM_Build_8029100_available | IQM Build 8029100 Hotfix34]] is now available from the [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 10:35, 18 February 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Operator9 90244 (hotfix23) available | Operator9 hotfix23]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:38, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP62_3040620_(6.2.3)_released | Wireless Handset Firmware IP62 3040620 (6.2.3)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:27, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM_Software_3130111_%284.0.0%29_released | WinPDM Software 3130111 (4.0.0)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:04, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10311_(2.11.4)/IP65_10117_(2.11.4)_released | Wireless Handset Firmware IP64 10311 (2.11.4)/IP65 10117 (2.11.4)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 09 December 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:IQM_Build_8028700_available | IQM Build 8028700 Hotfix33]] is now available from the [http://download.innovaphone.com/ice/8.00/#iqm V8 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Linux_Application_Platform_100271_(sr64)_available | Linux Application Platform V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Reporting_100271_(sr64)_available | innovaphone Reporting V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Fax_100271_(sr64)_available | innovaphone Fax V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Exchange_Calendar_Connector_100271_(sr64)_available | innovaphone Exchange Calendar Connector V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP61_3022811_(4.7.8)/IP63_3022912_(4.7.8)_released | Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_and_Management_Software_product/9.00/wireless_100037_%28hotfix19%29_available | Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 07:56, 9 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:App_Platform_build_90007_available | App Platform build 90007]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 02 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Recording_Build_121100_available | innovaphone Recording SR29 build 121100]] is now available from the [http://download.innovaphone.com/ice/10.00/#recording V10 download area].&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
{{Special:Newpages/8,namespace=Howto,namespace=Support,namespace=Reference,namespace=Reference7,namespace=Reference8}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
* [[Support:What are the Roadmap Documents? | Roadmaps ]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61048</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Main_Page&amp;diff=61048"/>
		<updated>2022-02-14T16:37:53Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* Latest News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;!-- Message of the day --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote Support ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://get.anydesk.com/PK8coqHH/AnyDesk.exe Download Anydesk]&lt;br /&gt;
&lt;br /&gt;
== Before you try to use this wiki ==&lt;br /&gt;
To get access &#039;&#039;&#039;[[Account_Creation|READ THIS FIRST]]&#039;&#039;&#039;, make sure you [[Special:Userlogin|log in]] and have [[Account_Creation|your account authorized]].&lt;br /&gt;
&lt;br /&gt;
You may then modify most of the articles and even add new ones.  We hope for a rich and useful platform for professional innovaphone users to emerge this way.&lt;br /&gt;
&lt;br /&gt;
To make sure you understand the terms of use, have a quick look at the [[innovaphone-wiki:About | legal stuff]].  But do not waste too much time there!  Instead, rather browse through the information provided.  There are various hopefully useful links in the sidebar on the left.&lt;br /&gt;
&lt;br /&gt;
== Searching ==&lt;br /&gt;
Searching in wiki works, but is sometimes cumbersome.  However, you can have google do the job for you.  Try [https://www.google.de/search?q=site%3Ainnovaphone.com+xml+documentation &amp;lt;code&amp;gt;site:innovaphone.com your search terms&amp;lt;/code&amp;gt;] to search the innovaphone sites for matches!&lt;br /&gt;
&lt;br /&gt;
If you still don&#039;t find what you are looking for, [mailto:presales-at-innovaphone-dot-com drop us a message]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- latest news commented out, may be reactivated once there are new really --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please insert new message ON TOP and remove extraneous (more than 5) old messages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;nowiki&amp;gt; ~~~~ is replaced by your name and date automatically &amp;lt;/nowiki&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest News ==&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 17:37, 14 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V11r2 product/11r2/firmware 113799 (sr 59) available | Version 11r2 Service Release 59]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10313_(2.12.10)/IP65_10118_(2.12.10)_released | Wireless Handset Firmware IP64 10313 (2.12.10)/IP65 10118 (2.12.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 15:05, 11 February 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP73_1004_(3.0.10)_released | Wireless Handset Firmware IP73 1004 (3.0.10)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 15:30, 17 January 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V12r2 product/12r2/firmware 125847 (sr 52) available | Version 12r2 Service Release 52]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 15:30, 17 January 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r1 product/13r1/firmware 133100 (sr 35) available | Version 13r1 Service Release 35]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 15:30, 17 January 2022 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Firmware V13r2 product/13r2/firmware 136268 (sr 8) available | Version 13r2 Service Release 8]] is now available from the [http://store.innovaphone.com/release/download.htm download page].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 16 June 2021 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:iQM_Build_8029100_available | IQM Build 8029100 Hotfix34]] is now available from the [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 12:46, 16 June 2021 (CEST))&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:TAPI Service Provider 8188 (hotfix21) available|TAPI Service Provider 8188 (hotfix21)]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Inno-mst|Inno-mst]] 10:35, 18 February 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Operator9 90244 (hotfix23) available | Operator9 hotfix23]] is now available from [https://store.innovaphone.com/release/download.htm the Software download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:38, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP62_3040620_(6.2.3)_released | Wireless Handset Firmware IP62 3040620 (6.2.3)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:27, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:WinPDM_Software_3130111_%284.0.0%29_released | WinPDM Software 3130111 (4.0.0)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 17:04, 21 January 2021 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP64_10311_(2.11.4)/IP65_10117_(2.11.4)_released | Wireless Handset Firmware IP64 10311 (2.11.4)/IP65 10117 (2.11.4)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 09 December 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:IQM_Build_8028700_available | IQM Build 8028700 Hotfix33]] is now available from the [http://download.innovaphone.com/ice/8.00/#iqm V8 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Linux_Application_Platform_100271_(sr64)_available | Linux Application Platform V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Reporting_100271_(sr64)_available | innovaphone Reporting V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Fax_100271_(sr64)_available | innovaphone Fax V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 13:17, 2 November 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Innovaphone_Exchange_Calendar_Connector_100271_(sr64)_available | innovaphone Exchange Calendar Connector V10 100271 sr64]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 18:21, 12 October 2020 (CEST)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_IP61_3022811_(4.7.8)/IP63_3022912_(4.7.8)_released | Wireless Handset Firmware IP61 3022811 (4.7.8)/IP63 3022912 (4.7.8)]] is now available from the [https://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Afi|Afi]] 21:30, 27 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Wireless_Handset_Firmware_and_Management_Software_product/9.00/wireless_100037_%28hotfix19%29_available | Wireless Package hotfix 19]] is now available from the [http://download.innovaphone.com/ice/9.00#wireless V9 download area].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:Dde|Dde]] 07:56, 9 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:App_Platform_build_90007_available | App Platform build 90007]] is now available from the [http://store.innovaphone.com/release/download.htm App store].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;[[User:kwa|kwa]] 14:00, 02 March 2020 (CET)&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Support:Recording_Build_121100_available | innovaphone Recording SR29 build 121100]] is now available from the [http://download.innovaphone.com/ice/10.00/#recording V10 download area].&lt;br /&gt;
&lt;br /&gt;
== New Articles ==&lt;br /&gt;
{{Special:Newpages/8,namespace=Howto,namespace=Support,namespace=Reference,namespace=Reference7,namespace=Reference8}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0px; margin-right:10px; margin-top:15px; border:1px solid #58C4C3; background-color:#F4F4F4; padding:0em 1em 0.5em 1em; font-size:1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More innovaphone Ressources ==&lt;br /&gt;
* [http://www.innovaphone.com Home Page]&lt;br /&gt;
* [http://download.innovaphone.com Download Site ]&lt;br /&gt;
* [http://my.innovaphone.com my.innovaphone ]&lt;br /&gt;
* [http://mantis.innovaphone.com/ Ticketing System ]&lt;br /&gt;
* [[Support:What are the Roadmap Documents? | Roadmaps ]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r2:Concept_Innovaphone_Virtual_Appliance_(IPVA)&amp;diff=60221</id>
		<title>Reference13r2:Concept Innovaphone Virtual Appliance (IPVA)</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r2:Concept_Innovaphone_Virtual_Appliance_(IPVA)&amp;diff=60221"/>
		<updated>2021-10-15T09:43:28Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: /* How Much RAM Is Required Per IPVA Instance? */ Removed obsolete paragraph&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept12r1|{{PAGENAME}}]]&lt;br /&gt;
&amp;lt;!--ipva virtual virtuell va--&amp;gt;&lt;br /&gt;
==Applies To==&lt;br /&gt;
This information applies to:&lt;br /&gt;
*V13r2&lt;br /&gt;
*innovaphone Virtual Appliance&lt;br /&gt;
*Intel/AMD CPUs&lt;br /&gt;
*VMware &lt;br /&gt;
**Workstation &lt;br /&gt;
**Player &amp;lt;ref&amp;gt;VMware Player Download(free): http://vmware.com/download/player/&amp;lt;/ref&amp;gt;&lt;br /&gt;
**vSphere 4.x-6.x&lt;br /&gt;
**ESXi 6.0&lt;br /&gt;
*For support of Hyper-V, refer to [[Reference12r2:Concept IPVA On Hyper-V]].&lt;br /&gt;
&lt;br /&gt;
==More Information==&lt;br /&gt;
The innovaphone Virtual Appliance (IPVA) is a virtual machine to be run on a virtualization platform.&lt;br /&gt;
Whereby, VMware&amp;lt;ref&amp;gt;http://www.vmware.com&amp;lt;/ref&amp;gt; and Hyper-V&amp;lt;ref&amp;gt;https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/about/&amp;lt;/ref&amp;gt;  are the solely supported virtualization platforms to-date. This aticle describes teh use of VMware, for support of Hyper-V, refer to this [[Concept_IPVA_On_Hyper-V|article]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IPVA is a software-only solution. It appears as and performs as an innovaphone &amp;quot;hard-box&amp;quot; excluding DSP-, ISDN-/AB-resources.&lt;br /&gt;
&lt;br /&gt;
The following core-components are contained within the IPVA:&lt;br /&gt;
*innovaphone PBX&lt;br /&gt;
*innovaphone Gateway (a.k.a &#039;&#039;Relay&#039;&#039;)&lt;br /&gt;
*integrated mass-storage (alike innovaphones&#039; CF-card support)&lt;br /&gt;
&amp;lt;!-- Keywords: IP-VA ip-va ipva --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
[[#Download|Download]] the IPVA. &lt;br /&gt;
&lt;br /&gt;
;ipva-ovf.zip:&lt;br /&gt;
The compressed archive &#039;&#039;ipva-ovf.zip&#039;&#039; contains the file ipva.ova. A virtual machine according to the &#039;&#039;&#039;O&#039;&#039;&#039;pen &#039;&#039;&#039;V&#039;&#039;&#039;irtualization &#039;&#039;&#039;F&#039;&#039;&#039;ormat specification. A deployment of ipva.ova will result in a set of 5 files - the file names may differ from the following list:&lt;br /&gt;
*ipva.vmx:     The virtual machine configuration file&lt;br /&gt;
*hd-boot.vmdk: The virtual boot harddisk (hd)&lt;br /&gt;
**On IDE 0:0&lt;br /&gt;
*hd-cf.vmdk:   The hd for emulation of a Compact Flash card&lt;br /&gt;
**On IDE 0:1&lt;br /&gt;
*hd-flash.vmdk:    The hd for emulation of flash memory&lt;br /&gt;
**On IDE 1:0&lt;br /&gt;
*hd-dump.vmdk: The hd serving as a store for a crash dump&lt;br /&gt;
**On IDE 1:1&lt;br /&gt;
&lt;br /&gt;
;ipva.bin:&lt;br /&gt;
The file &#039;&#039;ipva.bin&#039;&#039; is the firmware file, which is only needed for update purposes.&lt;br /&gt;
&lt;br /&gt;
;ipva-vmx.zip:&lt;br /&gt;
A legacy zip file containing the IPVA according to a VMware proprietary format.&lt;br /&gt;
&lt;br /&gt;
===VMware Player And VMware Workstation===&lt;br /&gt;
*Copy the file ipva.ova to e.g. your desktop&lt;br /&gt;
*Double-click on ipva.ova.&lt;br /&gt;
**The IPVA is going to be imported.&lt;br /&gt;
*Edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
**&#039;&#039;&#039;Note&#039;&#039;&#039;: Skipping this configuration setting will let the IPVA crash&lt;br /&gt;
*Power-on the machine&lt;br /&gt;
&lt;br /&gt;
===VMware vSphere===&lt;br /&gt;
*Import ipva.ova by means of &#039;&#039;&#039;File/Deploy OVF-Template...&#039;&#039;&#039; (de: &#039;&#039;&#039;Datei/OFV-Vorlage bereitstellen...&#039;&#039;&#039;) and follow instructions.&lt;br /&gt;
*Edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
**&#039;&#039;&#039;Note&#039;&#039;&#039;: Skipping this configuration step will let the IPVA crash&lt;br /&gt;
*Power-on the machine&lt;br /&gt;
&lt;br /&gt;
===Network Configuration===&lt;br /&gt;
Manufacturer-configured as DHCP client only. I.e. a DHCP server must be available. Afterwards the network configuration may be administrated as used to within the web ui of other innovaphone boxes. If there&#039;s in no case a DHCP server available for the 1st-time configuration, read through [[#What_Is_The_Console_Good_For?|What Is The Console Good For?]].&lt;br /&gt;
&lt;br /&gt;
====MAC/serial number====&lt;br /&gt;
Take care that you use a MAC address which is supported by my.innovaphone, see [[Reference:My_Innovaphone#IPVA_MAC_exists]].&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
&lt;br /&gt;
IPVA.zip&lt;br /&gt;
* v12r1: https://download.innovaphone.com/ice/12r1/#firmware&lt;br /&gt;
* v12r2: https://download.innovaphone.com/ice/12r2/#firmware&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
Support procedures are commonly identical to the ones known from innovaphones&#039; physical appliances. Except for:&lt;br /&gt;
*&#039;&#039;&#039;Post-Mortem Logs&#039;&#039;&#039; A post-mortem log must be retrieved by clicking on &#039;&#039;Maintenance/Diagnostics/Tracing/&#039;&#039;&#039;trace(crash-dump)&#039;&#039;&#039;&#039;&#039; (alternatively: http://a.b.c.d/crash_dump.txt).&lt;br /&gt;
&lt;br /&gt;
Some known issues are listed further below under [[#FAQ | FAQ]].&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
=== Restored IPVA may not run ===&lt;br /&gt;
We have seen issues where an IPVA which had been backed up using one of the available backup tools for VMWare do not start up properly when they have been restored. &lt;br /&gt;
&lt;br /&gt;
We strongly suggest to not rely on VMWare backup mechanism but instead to use the standard innovaphone backup scheme (that is, save the configuration on a regular basis).&lt;br /&gt;
&lt;br /&gt;
==== How to run a restored backup that fails to start ====&lt;br /&gt;
Here is the procedure to run an IPVA from an IPVA if the restored virtual machine does not boot up properly:&lt;br /&gt;
&lt;br /&gt;
* restore the backed up V10 IPVA&lt;br /&gt;
* create a new, empty V11r1 IPVA (you will need this merely to copy the boot disk from)&lt;br /&gt;
*replace the boot disk of the failing V10 IPVA by the boot disk of the fresh V11r1 IPVA (see [[#How_To_Replace_The_Boot_Disk_On_vSphere.3F | How To Replace The Boot Disk On vSphere]] for details)&lt;br /&gt;
* start the restored and fixed V10 IPVA (it should run fine now)&lt;br /&gt;
* downgrade this V10 IPVA to desired V10 firmware&lt;br /&gt;
* remove the fresh V11r1 IPVA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some Customer who are running Fw v12r1 (up to sr6) with ESXi 6.0 and VEEAM 9 reported that after a backup with VEEAM 9, the restored IPVA was not starting. &lt;br /&gt;
At this point, there is no possibility to solve this problem. The only workaround in that case is to delete the machine, reinstall a new one, and restore a configuration saved before.&lt;br /&gt;
&lt;br /&gt;
If you did not run into the problem yet, for prevention, we recommend to replace the Boot disk of your working IPVA.vmx with one of the IPVA.ova. Please follow the steps below (be aware that this will upgrade the firmware on the IPVA to 12r2, due to the fact that actually, IPVA.ova is only available from version 12r2):&lt;br /&gt;
&lt;br /&gt;
1. Remove the Boot disk of the virtual machine (vmx)(is normaly the first one).&amp;lt;br&amp;gt;&lt;br /&gt;
* Power off the VM&lt;br /&gt;
* Select the Virtual Machine &amp;gt; Settings.&lt;br /&gt;
* On the Hardware tab, select the virtual hard disk and click &#039;&#039;Remove&#039;&#039;.&lt;br /&gt;
* Click &#039;&#039;OK&#039;&#039; to save your changes.&lt;br /&gt;
&lt;br /&gt;
2. Add the Boot disk of the ova virtual machine to the vmx one.&lt;br /&gt;
* Identify the size of the boot disk of the ova virtual machine (will be needed on the step when navigating to boot disk)&lt;br /&gt;
* On the powered off VM, Select the Virtual Machine &amp;gt; Settings.&lt;br /&gt;
* On the Hardware tab, select the virtual hard disk and click &#039;&#039;Add&#039;&#039;.&lt;br /&gt;
* Select Use “an existing virtual disk” then click &#039;&#039;Next&#039;&#039;.&lt;br /&gt;
* Navigate to the boot disk of the ova Virtual machine then click &#039;&#039;next&#039;&#039;.&lt;br /&gt;
* Click &#039;&#039;Finish&#039;&#039;.&lt;br /&gt;
Now the vmx virtual machine should have the Fw version 12r2.&lt;br /&gt;
&lt;br /&gt;
The .ova version will be available also in V12r1 sr7&lt;br /&gt;
&lt;br /&gt;
=== IPVA does not run on Citrix Cloud Platform ===&lt;br /&gt;
Reportedly, the Citrix cloud platform - although based on VMware - cannot run the IPVA.  Amongst other issues, the platform does not allow 4 virtual disks, which are required for the IPVA.&lt;br /&gt;
&lt;br /&gt;
=== IPVA does not run on VCloud Air ===&lt;br /&gt;
VCloud Air apparently does not support the timekeeping mechanism required by the IPVA.&lt;br /&gt;
&lt;br /&gt;
[[User:Ckl|ckl]] 15:50, 30 November 2016 (CET) We have seen the IPVA v12r2 running on vCloud Air. Use the ova import.&lt;br /&gt;
&lt;br /&gt;
=== IPVA on ESX 6.5 ===&lt;br /&gt;
We have reports that the IPVA does not run properly on ESX 6.5.  The IPVA boots up properly but the clock does not run.  Running the .ova based variation available in v12r2 fixed the issue or edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
=== Administration: Avoid &#039;reboot&#039; Command. Use &#039;reset&#039; Command ===&lt;br /&gt;
Alwas use the &#039;reset&#039; command to restart an IPVA. &lt;br /&gt;
The &#039;reboot&#039; command makes sense only on physical applicances, where its purpose is to deploy a new bootcode by means of a forced watchdog trap. The resulting post-reboot state will be as if an unsolicited trap/crash had occurred.&lt;br /&gt;
&lt;br /&gt;
=== No Fault Tolerance Support from VMWare vSphere 6.5 ===&lt;br /&gt;
We have reports that VMWare vSphere 6.5 Fault Tolerance (FT) no longer works. For further information regarding this feature, please refer to the respective note in [[Howto:Implement_PBX_with_zero_downtime_using_IPVA_and_VMWare_Fault_Tolerance | Implement PBX with zero downtime using IPVA and VMWare Fault_Tolerance]].&lt;br /&gt;
&lt;br /&gt;
=== Voice Quality Issues ===&lt;br /&gt;
When dealing with media streams (e.g. for announcements), the IPVA needs to fulfil real-time processing requirements, for example to process RTP packets in a timely fashion.  To do so, the IPVA relies on the capabilities of the virtualization platform it runs on. &lt;br /&gt;
&lt;br /&gt;
It is therefore important to configure the platform so that it supports real-time applications best. If you experience voice quality or latency issues, consider &lt;br /&gt;
* to make sure that all of the IPVAs memory is &#039;&#039;reserved&#039;&#039; to the IPVA (&#039;&#039;Latency Sensitivity&#039;&#039; set to &#039;&#039;High&#039;&#039;)&lt;br /&gt;
* to guarantee exclusive PCPU access&lt;br /&gt;
This helps to reduce CPU halt/wake-up states.&lt;br /&gt;
&lt;br /&gt;
===Additional vCPUs may cause problems===&lt;br /&gt;
The Multi-Core functionality of version 13r2 is a beta functionality. Additional virtual CPUs(vCPUs) should not be utilized in production environments.&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
===Can The Emulated CompactFlash Be Increased In Size?===&lt;br /&gt;
Yes, from within the &#039;&#039;Edit Virtual Machine&#039;&#039; dialog. Doing so just increases the size of the virtual harddisk. The emulated CompactFlash must be formatted afterwards and accordingly to benefit from the increased size. That step can be administrated from &#039;&#039;Administration/Compact Flash/Format&#039;&#039;. Note: A recommendation for an upper size limit is not given.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;vSphere / vSphere Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. At first backup all of your files from CF card&amp;lt;br&amp;gt;&lt;br /&gt;
2. Shutdown the corresponding IPVA&amp;lt;br&amp;gt;&lt;br /&gt;
3. Choose &amp;quot;Properties&amp;quot; of the IPVA&amp;lt;br&amp;gt;&lt;br /&gt;
4. Delete &amp;quot;Harddrive 2&amp;quot; (Hardrive file xxx/xxx_1.vmdk)&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 hd-boot.vmdk  &amp;gt; xxx.vmdk&lt;br /&gt;
 hd-cf.vmdk    &amp;gt; xxx_1.vmdk&lt;br /&gt;
 hd-flash.vmdk &amp;gt; xxx_2.vmdk&lt;br /&gt;
 hd-dump.vmdk  &amp;gt; xxx_3.vmdk&lt;br /&gt;
&lt;br /&gt;
5. Create new harddrive&amp;lt;br&amp;gt;&lt;br /&gt;
6. Configure the required size&amp;lt;br&amp;gt;&lt;br /&gt;
7. As &amp;quot;Node of virtual device&amp;quot; select &amp;quot;IDE(0:1)&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
8. Start the IPVA.&amp;lt;br&amp;gt;&lt;br /&gt;
9. &amp;quot;Format&amp;quot; the CF Card and &amp;quot;mount&amp;quot; it (General/Compact-Flash/General)&lt;br /&gt;
&lt;br /&gt;
===What Is The Size Of the emulated Flash Storage on the IPVA?===&lt;br /&gt;
The virtual flash storage used to store configuration file of the IPVA and LDAP directory of the PBX is defined with 64 MB and can not be changed. This is two times more than on IP6010. The VMDK-File hd-flash.vmdk is allocated with 100 MB, because VMWare can not handle smaller virtual disks.&lt;br /&gt;
&lt;br /&gt;
===What Is The Size Of the Flash Directory on the IPVA?===&lt;br /&gt;
As noted above, the virtual flash memory on the IPVA is fixed to a size of 64MB.  Most of the flash is used by the &#039;&#039;flash directory&#039;&#039; (FLASHDIR0) which amongst other things provides storage for PBX objects.&lt;br /&gt;
&lt;br /&gt;
The size of the flash directory depends on the available RAM. The maximum of 900 segments á 64KB, i.e. ~56MB, is available if 192MB or more RAM is available. If less RAM is available, the size of the flash directory is decreased accordingly.  For this reason, it is unsafe to reduce RAM size in a given IPVA, as the flash directory size may be decreased so that objects from the flash directory get lost.&lt;br /&gt;
&lt;br /&gt;
The easiest method to see how much flash directory space is available is to investigate the boot trace. For the standard configuration of 64MB the respective trace output is going to look as follows and informs about a size of 14MB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code type=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0:0000:081:4 - start flashdir FLASHDIR0&lt;br /&gt;
0:0000:081:4 - fdir: segments=901-&amp;gt;224(14.0MB)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How Much RAM Is Required Per IPVA Instance?===&lt;br /&gt;
Since 12r2sr27/13r1sr5 the downloadable virtual appliance comes preconfigured with 256MB RAM. This amount is seen as a good trade-off for the majority of all installations.&lt;br /&gt;
The RAM-size can be administrated by VMware-means.&lt;br /&gt;
&lt;br /&gt;
===What Is The Maximum Amount Of RAM?===&lt;br /&gt;
The maximum meaningful RAM setting is 3GB. Memory space beyond that limit will be left unused. Assigning more than 3GB to an IPVA instance doesn&#039;t provide any benefit.&lt;br /&gt;
&lt;br /&gt;
===Why Does &#039;&#039;General/Info/DRAM&#039;&#039; Show Less Than the Configured Memory?===&lt;br /&gt;
Not all of the configured memory is available to the IPVA. E.g. a bit of memory is occupied by the VMM&amp;lt;ref&amp;gt;Virtual Machine Monitor: A component belonging to the virtualization platform&amp;lt;/ref&amp;gt;. The indicator &#039;&#039;General/Info/DRAM&#039;&#039; displays the memory available to the IPVA and is truncated down to a whole number. A boot-trace reveals a bit more about IPVA-available memory as shown in the following excerpt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
0:0000:030:4 - Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz&lt;br /&gt;
0:0000:030:4 - mem(64946176)=61.93MB ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How Many IPVA Instances Are Possible Per Host?===&lt;br /&gt;
There&#039;s no worst-case estimate available. For a best-case calculation, &lt;br /&gt;
*see [http://www.vmware.com/pdf/vsphere4/r41/vsp_41_config_max.pdf  Configuration Maximums VMware vSphere 4.1]&lt;br /&gt;
*see [[#How_Much_RAM_Is_Required_Per_IPVA_Instance.3F | How Much RAM Is Required Per IPVA Instance?]]&lt;br /&gt;
Additional preformance reflections&lt;br /&gt;
*see [[HOWTO:A_rough_estimate_of_IPVA_Performance | A rough estimate of IPVA Performance]]&lt;br /&gt;
&lt;br /&gt;
===How do I perform a factory reset?===&lt;br /&gt;
&lt;br /&gt;
replace the 3rd disk, served on IDE 1:0, named hd-flash.vmdk with an empty disk:&lt;br /&gt;
&lt;br /&gt;
[[Image:VM_Settings.png]]&lt;br /&gt;
&lt;br /&gt;
1)download the IPVA and watch out for the file hd-flash.vmdk&lt;br /&gt;
&lt;br /&gt;
2)Power-off the IPVA instance&lt;br /&gt;
&lt;br /&gt;
3)Replace hd-flash.vmdk with the one downloaded in step 1). If on vsphere it may have been assigned a different name. Ensure it’s the one on IDE 1:0.&lt;br /&gt;
&lt;br /&gt;
4)Power-on the IPVA instance&lt;br /&gt;
&lt;br /&gt;
===What About VMware Tools?===&lt;br /&gt;
VMware Tools are not supported.&lt;br /&gt;
&lt;br /&gt;
===What Is The Console Good For?===&lt;br /&gt;
The console is a remains of the early development phase. It resembles the IP3000&#039;s serial console. It doesn&#039;t offer any convenience like command history or backspace funtionality. Nevertheless may the console be of help in exceptional situations where e.g. the required DHCP server isn&#039;t available for 1st-time configuration or in situations where the ip configuration was misconfigured. Thereby any command from a device&#039;s config is acceptable. &lt;br /&gt;
&lt;br /&gt;
For instance to configure the static IP address 1.2.3.4/24 on ETH0:&lt;br /&gt;
*Click into the console&lt;br /&gt;
*Press ENTER&lt;br /&gt;
*Enter credentials&lt;br /&gt;
*Enter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config change IP0 ETH0 /addr 1.2.3.4 /mask 255.255.255.0&lt;br /&gt;
config change DHCP0 /mode off&lt;br /&gt;
config write&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since no backspace is offered it may become a daring task to enter a single line without typos. In case of a typo hit ENTER and input the same line again.&lt;br /&gt;
The keyboard layout is the US layout.&lt;br /&gt;
[[Image:Ip-via-console.png|center|thumb|200px|Console-edit of IP address]]&lt;br /&gt;
&lt;br /&gt;
Display the IP configuration for ETH0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config show IP0 ETH0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Display the DHCP configuration for ETH0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config show DHCP0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional the DNS-server(s) and the default gateway can be configured:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config change IP0 ETH0 /addr 1.2.3.4 /mask 255.255.255.0 /dns 8.8.8.8 /dns2 8.8.4.4&lt;br /&gt;
config change IP0 RT0 /gateway 1.2.3.254&lt;br /&gt;
config change DHCP0 /mode off&lt;br /&gt;
config write&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also some simple diagnostics (ping and traceroute) are possible via the console (output is given in the console):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mod cmd PING0 tracert 8.8.8.8&lt;br /&gt;
mod cmd PING0 ping 8.8.8.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resetting the entire FLASH space - &#039;&#039;&#039;Note, all configuration will get lost&#039;&#039;&#039;. this is similar method to the manufacturer reset method from above [[#How_do_I_perform_a_factory_reset.3F|How do I perform a factory reset?]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mod cmd FLASHMAN0 reset all&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of A Checksum Boot Error?===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
checksum wrong! Loading failed for image=IPVA    BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:ipva-crc-wrong.jpg|center|thumb|200px|Console displays CRC boot error]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&lt;br /&gt;
*Power-off the IPVA&lt;br /&gt;
*Replace the boot harddisk by a fresh one. The boot harddisk is the 1st hd(originally named &#039;&#039;hd-boot.vmdk&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This problem may occur on a system crash while a firmware update is taking place.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;NIC unavailable!&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIC unavailable!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:ipva-nic-unavailable.jpg|center|thumb|200px|Console displays &#039;&#039;NIC unavailable!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&lt;br /&gt;
*Power-off the IPVA&lt;br /&gt;
*Administrate by VMware means: Ensure the correct/expected type of network interface controller(NIC) is going to be offered by the hypervisor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IPVA offers driver support for:&lt;br /&gt;
*AMD NIC: Am79C970A PCnet-PCI II Single-Chip Full-Duplex Ethernet Controller&lt;br /&gt;
**a.k.a &#039;&#039;PCNet32&#039;&#039;&lt;br /&gt;
**a.k.a &#039;&#039;Vlance&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The AMD-NIC is kind of default. However, the NIC type may be overriden manually and accordingly within the configuration file ipva.vmx as follows&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ethernet0.virtualDev = &amp;quot;vlance&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This problem may occur after a VMware re-configuration of the network settings.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
perfcounter-not enabled!!!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:screenshot-ipva-perfcounter-nok.jpg|center|thumb|200px|Console displays &#039;&#039;perfcounter-not enabled!!!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
This problem is likely caused by an OVA-import of the IPVA. The appliance&#039;s configuration file &#039;&#039;ipva.vmx&#039;&#039; requires a VMware proprietary configuration line that&#039;s not specifiable within an OVA-file. &lt;br /&gt;
&lt;br /&gt;
The IPVA utilizes a VMware proprietary mechanism for its internal timekeeping&amp;lt;ref&amp;gt;Timekeeping in Virtual Machines http://www.vmware.com/pdf/vmware_timekeeping.pdf&amp;lt;/ref&amp;gt;. That mechanism is only available after adding the following line to the configuration file &#039;&#039;ipva.vmx&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
monitor_control.pseudo_perfctr = TRUE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If that line is not present, the hypervisor is going to throw a CPU exception. Hint: In vSphere a VMX-file can be edited under &#039;&#039;&#039;Edit Settings/Options/Advanced/General/Configuration Parameters&#039;&#039;&#039;&amp;lt;ref&amp;gt;vmware Labs - How to edit vmx file in ESXi vSphere: https://www.youtube.com/watch?v=ICICoq-maB0&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
*The vmx file should be edited after the installation of the IPVA.&lt;br /&gt;
*The vmx file should NOT be edited with Text editor (use vSphere as shown above)&lt;br /&gt;
*To our knowledge, a converter is always necessary for the installation with vmx.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;Loading failed for image=IPVA    BIN&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Loading failed for image=IPVA    BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Ipva-fw-load-failed.png|center|thumb|200px|Console displays &#039;&#039;Loading failed for image=IPVA    BIN&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
This problem is likely caused by a calculation fault within the boot-code. &lt;br /&gt;
*The solution requires a replacement of the boot disk hd-boot.vmdk. &lt;br /&gt;
**Download an IPVA package from on 11r2 sr22.&lt;br /&gt;
**Replace the 1st disk with the one from the downloaded package&lt;br /&gt;
&lt;br /&gt;
===Are Additional vCPUs useful?===&lt;br /&gt;
The Multi-Core functionality of version 13r2 is a beta functionality. Additional virtual CPUs(vCPUs) should not be utilized in production environments.&lt;br /&gt;
&lt;br /&gt;
===How To Replace The Boot Disk On vSphere?===&lt;br /&gt;
The recommended way is as follows:&lt;br /&gt;
*With ipva.ova deploy a fresh IPVA by means of &#039;&#039;&#039;File/Deploy OVF-Template...&#039;&#039;&#039; (de: &#039;&#039;&#039;Datei/OFV-Vorlage bereitstellen...&#039;&#039;&#039;) and follow instructions.&lt;br /&gt;
**Its use to just serve as a copy source.&lt;br /&gt;
*Power-Off the old IPVA.&lt;br /&gt;
*In the old IPVA remove the 1st disk on IDE 0:0.&lt;br /&gt;
*From the new IPVA copy the 1st harddisk(on IDE 0:0) towards the old IPVA&#039;s directory.&lt;br /&gt;
*In the old IPVA add the 1st disk on IDE 0:0.&lt;br /&gt;
*In the old IPVA confirm and start the machine&lt;br /&gt;
&lt;br /&gt;
===What do the counters mean under Interface/Ethx/Statistic?===&lt;br /&gt;
;rx-drop: Accumulates register CSR112 &amp;lt;ref&amp;gt;Command and Status Register&amp;lt;/ref&amp;gt; of the emulated chip AM79C970. CSR112: Missed Frame Count. An increase of this value indicates the IPVA was not able to process the network frames fast enough.&lt;br /&gt;
;ifInDiscards: Sum of rx-drop, frames dropped due to interface link not up, unsupported ethernet type, internal receive queue full, drop frames of different vlan, drop non vlan frames if vlan is configured&lt;br /&gt;
;rx-frame-blocked: Unsupported IP protocol&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
[[Reference10:Licenses]]&lt;br /&gt;
&lt;br /&gt;
[[Howto:A_rough_estimate_of_IPVA_Performance | Howto:A_rough_estimate_of_IPVA_Performance]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept|Innovaphone Virtual Appliance]]&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Concept_802.1X&amp;diff=59906</id>
		<title>Concept 802.1X</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Concept_802.1X&amp;diff=59906"/>
		<updated>2021-09-10T14:25:11Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: added section &amp;quot;Debugging&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|802.1X]]&lt;br /&gt;
=Info=&lt;br /&gt;
&#039;&#039;&#039;802.1X,&#039;&#039;&#039; Port-Based Network Control, is an IEEE standard. The standard allows LAN devices (wired network cabling!&amp;lt;ref&amp;gt;The standard refers to 802 LANs as a whole, including shared media such as 802.11 WLANs. However, only 802.3 LANs are targeted by the functionality discussed in this article.&amp;lt;/ref&amp;gt;) to perform an authentication handshake within the 802.3 link layer (Ethernet).&lt;br /&gt;
The authentication is encapsulated within EAP over LAN (EAPOL) frames. No other traffic, except EAPOL is allowed prior to a successful authentication&amp;lt;ref&amp;gt;It is an authenticator&#039;s task to guarantee that non-EAPOL traffic won&#039;t be forwarded before an authentication succeeded.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;802.1X must not be considered a bullet-proof security mechanism, since all traffic following the authentication phase is not authenticated.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The standard specifies the following parties participating in an 802.1X authentication:&lt;br /&gt;
* Supplicant: The party supplying credentials towards an authenticator on the other side of a point-to-point link. An IP phone fulfills a supplicant&#039;s role. &lt;br /&gt;
** innovaphones&#039; IP phones are configured to support pass-through of EAPOL messages. A PC attached to the PC-port of a phone may also become a supplicant and may 802.1X-authenticate independently and separately&amp;lt;ref&amp;gt;Major authenticators do support multi-auth authentication&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Authenticator: The party facilitating the authentication. A switch will usually be the authenticator.&lt;br /&gt;
* Authentication Server: The party providing the authentication service to the authenticator. The 802.1X standard mentions a RADIUS server to be an authentication server.&lt;br /&gt;
&lt;br /&gt;
It is the Authenticator/Authentication Server deciding whether EAP-MD5 or EAP-TLS is going to be applied.&lt;br /&gt;
*&#039;&#039;&#039;Sample Protocol Flow, EAP-MD5:&#039;&#039;&#039;&lt;br /&gt;
[[Image:802dot1x-EAPOL-640x480.gif]]&lt;br /&gt;
*&#039;&#039;&#039;Sample Protocol Flow, EAP-TLS:&#039;&#039;&#039;&lt;br /&gt;
[[Image:IP240-eap-tls-success.PNG]]&lt;br /&gt;
&lt;br /&gt;
=Debugging=&lt;br /&gt;
The software module is capable of generating internal trace messages and RPCAP PDUs. Tracing can be enabled by activating a checkmark on the &#039;&#039;/debug.xml&#039;&#039; page of the firmware&#039;s web UI. The checkmark is named &#039;&#039;ENET1X0&#039;&#039; (for interface ETH0). The trace buffer can be fetched by a PC connected directly to the PC-port.&lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Howto:802.1X_EAP-TLS_With_FreeRadius|Howto article: 802.1X EAP-TLS With FreeRadius]]&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference11r2:Interfaces/ETH/802.1X&amp;diff=59905</id>
		<title>Reference11r2:Interfaces/ETH/802.1X</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference11r2:Interfaces/ETH/802.1X&amp;diff=59905"/>
		<updated>2021-09-10T14:13:58Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: correcting proxy logoff mechanism&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;&#039;&#039;&#039;EAP-MD5&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;User&#039;&#039;&#039; Enter the user/identity to authenticate with.&lt;br /&gt;
* &#039;&#039;&#039;Password&#039;&#039;&#039; Enter the shared secret for the MD5 challenge/response handshake.&lt;br /&gt;
;&#039;&#039;&#039;EAP-TLS&#039;&#039;&#039;:&lt;br /&gt;
The EAP-MD5 settings are going to reused for EAP-TLS needs. I.e. there&#039;s currently no extra setting for EAP-TLS. The configuration for an actual certificate, being fed into the EAP-TLS session, can be found at &#039;&#039;General/Certificates/Device Certificate&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User&#039;&#039;&#039; Enter the user/identity&amp;lt;ref&amp;gt;EAP-TLS doesn&#039;t mandate that identity to necessarily be the same as the certificates subject/CN&amp;lt;/ref&amp;gt; to be sent within the EAP Identity request.&amp;lt;ref name=&amp;quot;user-pw&amp;quot;&amp;gt;A non-empty user/password just serves as an &amp;quot;on&amp;quot;-switch&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Password&#039;&#039;&#039; Enter arbitrary content.&amp;lt;ref name=&amp;quot;user-pw&amp;quot;/&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;General/Certificates/Device Certificate&#039;&#039;&#039;&lt;br /&gt;
;&#039;&#039;&#039;Proxy-Logoff&#039;&#039;&#039;:&lt;br /&gt;
If the phone&#039;s PC-port got disconnected, EAPOL-Logoff messages are going to be sent on behalf of participants that were connected to the phone&#039;s PC-port.&lt;br /&gt;
An EAPOL-Logoff will be sent for each MAC-address learned from traversing EAPOL-Start messages.&lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Related Articles=&lt;br /&gt;
[[Concept_802.1X|Concept 802.1X]]&lt;br /&gt;
&lt;br /&gt;
[[Howto:802.1X_EAP-TLS_With_FreeRadius|Howto article: 802.1X EAP-TLS With FreeRadius]]&lt;br /&gt;
&lt;br /&gt;
[[Howto:Security_works_with_innovaphone#802.1X_port_security|Howto article:Security_works_with_innovaphone]]&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r2:Concept_Innovaphone_Virtual_Appliance_(IPVA)&amp;diff=59817</id>
		<title>Reference13r2:Concept Innovaphone Virtual Appliance (IPVA)</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r2:Concept_Innovaphone_Virtual_Appliance_(IPVA)&amp;diff=59817"/>
		<updated>2021-08-25T15:01:46Z</updated>

		<summary type="html">&lt;p&gt;Inno-mst: Documenting 13r2 multi-core functionality as beta&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept12r1|{{PAGENAME}}]]&lt;br /&gt;
&amp;lt;!--ipva virtual virtuell va--&amp;gt;&lt;br /&gt;
==Applies To==&lt;br /&gt;
This information applies to:&lt;br /&gt;
*V13r2&lt;br /&gt;
*innovaphone Virtual Appliance&lt;br /&gt;
*Intel/AMD CPUs&lt;br /&gt;
*VMware &lt;br /&gt;
**Workstation &lt;br /&gt;
**Player &amp;lt;ref&amp;gt;VMware Player Download(free): http://vmware.com/download/player/&amp;lt;/ref&amp;gt;&lt;br /&gt;
**vSphere 4.x-6.x&lt;br /&gt;
**ESXi 6.0&lt;br /&gt;
*For support of Hyper-V, refer to [[Reference12r2:Concept IPVA On Hyper-V]].&lt;br /&gt;
&lt;br /&gt;
==More Information==&lt;br /&gt;
The innovaphone Virtual Appliance (IPVA) is a virtual machine to be run on a virtualization platform.&lt;br /&gt;
Whereby, VMware&amp;lt;ref&amp;gt;http://www.vmware.com&amp;lt;/ref&amp;gt; and Hyper-V&amp;lt;ref&amp;gt;https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/about/&amp;lt;/ref&amp;gt;  are the solely supported virtualization platforms to-date. This aticle describes teh use of VMware, for support of Hyper-V, refer to this [[Concept_IPVA_On_Hyper-V|article]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IPVA is a software-only solution. It appears as and performs as an innovaphone &amp;quot;hard-box&amp;quot; excluding DSP-, ISDN-/AB-resources.&lt;br /&gt;
&lt;br /&gt;
The following core-components are contained within the IPVA:&lt;br /&gt;
*innovaphone PBX&lt;br /&gt;
*innovaphone Gateway (a.k.a &#039;&#039;Relay&#039;&#039;)&lt;br /&gt;
*integrated mass-storage (alike innovaphones&#039; CF-card support)&lt;br /&gt;
&amp;lt;!-- Keywords: IP-VA ip-va ipva --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
[[#Download|Download]] the IPVA. &lt;br /&gt;
&lt;br /&gt;
;ipva-ovf.zip:&lt;br /&gt;
The compressed archive &#039;&#039;ipva-ovf.zip&#039;&#039; contains the file ipva.ova. A virtual machine according to the &#039;&#039;&#039;O&#039;&#039;&#039;pen &#039;&#039;&#039;V&#039;&#039;&#039;irtualization &#039;&#039;&#039;F&#039;&#039;&#039;ormat specification. A deployment of ipva.ova will result in a set of 5 files - the file names may differ from the following list:&lt;br /&gt;
*ipva.vmx:     The virtual machine configuration file&lt;br /&gt;
*hd-boot.vmdk: The virtual boot harddisk (hd)&lt;br /&gt;
**On IDE 0:0&lt;br /&gt;
*hd-cf.vmdk:   The hd for emulation of a Compact Flash card&lt;br /&gt;
**On IDE 0:1&lt;br /&gt;
*hd-flash.vmdk:    The hd for emulation of flash memory&lt;br /&gt;
**On IDE 1:0&lt;br /&gt;
*hd-dump.vmdk: The hd serving as a store for a crash dump&lt;br /&gt;
**On IDE 1:1&lt;br /&gt;
&lt;br /&gt;
;ipva.bin:&lt;br /&gt;
The file &#039;&#039;ipva.bin&#039;&#039; is the firmware file, which is only needed for update purposes.&lt;br /&gt;
&lt;br /&gt;
;ipva-vmx.zip:&lt;br /&gt;
A legacy zip file containing the IPVA according to a VMware proprietary format.&lt;br /&gt;
&lt;br /&gt;
===VMware Player And VMware Workstation===&lt;br /&gt;
*Copy the file ipva.ova to e.g. your desktop&lt;br /&gt;
*Double-click on ipva.ova.&lt;br /&gt;
**The IPVA is going to be imported.&lt;br /&gt;
*Edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
**&#039;&#039;&#039;Note&#039;&#039;&#039;: Skipping this configuration setting will let the IPVA crash&lt;br /&gt;
*Power-on the machine&lt;br /&gt;
&lt;br /&gt;
===VMware vSphere===&lt;br /&gt;
*Import ipva.ova by means of &#039;&#039;&#039;File/Deploy OVF-Template...&#039;&#039;&#039; (de: &#039;&#039;&#039;Datei/OFV-Vorlage bereitstellen...&#039;&#039;&#039;) and follow instructions.&lt;br /&gt;
*Edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
**&#039;&#039;&#039;Note&#039;&#039;&#039;: Skipping this configuration step will let the IPVA crash&lt;br /&gt;
*Power-on the machine&lt;br /&gt;
&lt;br /&gt;
===Network Configuration===&lt;br /&gt;
Manufacturer-configured as DHCP client only. I.e. a DHCP server must be available. Afterwards the network configuration may be administrated as used to within the web ui of other innovaphone boxes. If there&#039;s in no case a DHCP server available for the 1st-time configuration, read through [[#What_Is_The_Console_Good_For?|What Is The Console Good For?]].&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
&lt;br /&gt;
IPVA.zip&lt;br /&gt;
* v12r1: https://download.innovaphone.com/ice/12r1/#firmware&lt;br /&gt;
* v12r2: https://download.innovaphone.com/ice/12r2/#firmware&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
Support procedures are commonly identical to the ones known from innovaphones&#039; physical appliances. Except for:&lt;br /&gt;
*&#039;&#039;&#039;Post-Mortem Logs&#039;&#039;&#039; A post-mortem log must be retrieved by clicking on &#039;&#039;Maintenance/Diagnostics/Tracing/&#039;&#039;&#039;trace(crash-dump)&#039;&#039;&#039;&#039;&#039; (alternatively: http://a.b.c.d/crash_dump.txt).&lt;br /&gt;
&lt;br /&gt;
Some known issues are listed further below under [[#FAQ | FAQ]].&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
=== Restored IPVA may not run ===&lt;br /&gt;
We have seen issues where an IPVA which had been backed up using one of the available backup tools for VMWare do not start up properly when they have been restored. &lt;br /&gt;
&lt;br /&gt;
We strongly suggest to not rely on VMWare backup mechanism but instead to use the standard innovaphone backup scheme (that is, save the configuration on a regular basis).&lt;br /&gt;
&lt;br /&gt;
==== How to run a restored backup that fails to start ====&lt;br /&gt;
Here is the procedure to run an IPVA from an IPVA if the restored virtual machine does not boot up properly:&lt;br /&gt;
&lt;br /&gt;
* restore the backed up V10 IPVA&lt;br /&gt;
* create a new, empty V11r1 IPVA (you will need this merely to copy the boot disk from)&lt;br /&gt;
*replace the boot disk of the failing V10 IPVA by the boot disk of the fresh V11r1 IPVA (see [[#How_To_Replace_The_Boot_Disk_On_vSphere.3F | How To Replace The Boot Disk On vSphere]] for details)&lt;br /&gt;
* start the restored and fixed V10 IPVA (it should run fine now)&lt;br /&gt;
* downgrade this V10 IPVA to desired V10 firmware&lt;br /&gt;
* remove the fresh V11r1 IPVA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some Customer who are running Fw v12r1 (up to sr6) with ESXi 6.0 and VEEAM 9 reported that after a backup with VEEAM 9, the restored IPVA was not starting. &lt;br /&gt;
At this point, there is no possibility to solve this problem. The only workaround in that case is to delete the machine, reinstall a new one, and restore a configuration saved before.&lt;br /&gt;
&lt;br /&gt;
If you did not run into the problem yet, for prevention, we recommend to replace the Boot disk of your working IPVA.vmx with one of the IPVA.ova. Please follow the steps below (be aware that this will upgrade the firmware on the IPVA to 12r2, due to the fact that actually, IPVA.ova is only available from version 12r2):&lt;br /&gt;
&lt;br /&gt;
1. Remove the Boot disk of the virtual machine (vmx)(is normaly the first one).&amp;lt;br&amp;gt;&lt;br /&gt;
* Power off the VM&lt;br /&gt;
* Select the Virtual Machine &amp;gt; Settings.&lt;br /&gt;
* On the Hardware tab, select the virtual hard disk and click &#039;&#039;Remove&#039;&#039;.&lt;br /&gt;
* Click &#039;&#039;OK&#039;&#039; to save your changes.&lt;br /&gt;
&lt;br /&gt;
2. Add the Boot disk of the ova virtual machine to the vmx one.&lt;br /&gt;
* Identify the size of the boot disk of the ova virtual machine (will be needed on the step when navigating to boot disk)&lt;br /&gt;
* On the powered off VM, Select the Virtual Machine &amp;gt; Settings.&lt;br /&gt;
* On the Hardware tab, select the virtual hard disk and click &#039;&#039;Add&#039;&#039;.&lt;br /&gt;
* Select Use “an existing virtual disk” then click &#039;&#039;Next&#039;&#039;.&lt;br /&gt;
* Navigate to the boot disk of the ova Virtual machine then click &#039;&#039;next&#039;&#039;.&lt;br /&gt;
* Click &#039;&#039;Finish&#039;&#039;.&lt;br /&gt;
Now the vmx virtual machine should have the Fw version 12r2.&lt;br /&gt;
&lt;br /&gt;
The .ova version will be available also in V12r1 sr7&lt;br /&gt;
&lt;br /&gt;
=== IPVA does not run on Citrix Cloud Platform ===&lt;br /&gt;
Reportedly, the Citrix cloud platform - although based on VMware - cannot run the IPVA.  Amongst other issues, the platform does not allow 4 virtual disks, which are required for the IPVA.&lt;br /&gt;
&lt;br /&gt;
=== IPVA does not run on VCloud Air ===&lt;br /&gt;
VCloud Air apparently does not support the timekeeping mechanism required by the IPVA.&lt;br /&gt;
&lt;br /&gt;
[[User:Ckl|ckl]] 15:50, 30 November 2016 (CET) We have seen the IPVA v12r2 running on vCloud Air. Use the ova import.&lt;br /&gt;
&lt;br /&gt;
=== IPVA on ESX 6.5 ===&lt;br /&gt;
We have reports that the IPVA does not run properly on ESX 6.5.  The IPVA boots up properly but the clock does not run.  Running the .ova based variation available in v12r2 fixed the issue or edit the file ipva.vmx according to [[#What_Can_I_Do_In_Case_Of_Boot-Problem:_perf-counter_not_enabled.21 | What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
=== Administration: Avoid &#039;reboot&#039; Command. Use &#039;reset&#039; Command ===&lt;br /&gt;
Alwas use the &#039;reset&#039; command to restart an IPVA. &lt;br /&gt;
The &#039;reboot&#039; command makes sense only on physical applicances, where its purpose is to deploy a new bootcode by means of a forced watchdog trap. The resulting post-reboot state will be as if an unsolicited trap/crash had occurred.&lt;br /&gt;
&lt;br /&gt;
=== No Fault Tolerance Support from VMWare vSphere 6.5 ===&lt;br /&gt;
We have reports that VMWare vSphere 6.5 Fault Tolerance (FT) no longer works. For further information regarding this feature, please refer to the respective note in [[Howto:Implement_PBX_with_zero_downtime_using_IPVA_and_VMWare_Fault_Tolerance | Implement PBX with zero downtime using IPVA and VMWare Fault_Tolerance]].&lt;br /&gt;
&lt;br /&gt;
=== Voice Quality Issues ===&lt;br /&gt;
When dealing with media streams (e.g. for announcements), the IPVA needs to fulfil real-time processing requirements, for example to process RTP packets in a timely fashion.  To do so, the IPVA relies on the capabilities of the virtualization platform it runs on. &lt;br /&gt;
&lt;br /&gt;
It is therefore important to configure the platform so that it supports real-time applications best. If you experience voice quality or latency issues, consider &lt;br /&gt;
* to make sure that all of the IPVAs memory is &#039;&#039;reserved&#039;&#039; to the IPVA (&#039;&#039;Latency Sensitivity&#039;&#039; set to &#039;&#039;High&#039;&#039;)&lt;br /&gt;
* to guarantee exclusive PCPU access&lt;br /&gt;
This helps to reduce CPU halt/wake-up states.&lt;br /&gt;
&lt;br /&gt;
===Additional vCPUs may cause problems===&lt;br /&gt;
The Multi-Core functionality of version 13r2 is a beta functionality. Additional virtual CPUs(vCPUs) should not be utilized in production environments.&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
===Can The Emulated CompactFlash Be Increased In Size?===&lt;br /&gt;
Yes, from within the &#039;&#039;Edit Virtual Machine&#039;&#039; dialog. Doing so just increases the size of the virtual harddisk. The emulated CompactFlash must be formatted afterwards and accordingly to benefit from the increased size. That step can be administrated from &#039;&#039;Administration/Compact Flash/Format&#039;&#039;. Note: A recommendation for an upper size limit is not given.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;vSphere / vSphere Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. At first backup all of your files from CF card&amp;lt;br&amp;gt;&lt;br /&gt;
2. Shutdown the corresponding IPVA&amp;lt;br&amp;gt;&lt;br /&gt;
3. Choose &amp;quot;Properties&amp;quot; of the IPVA&amp;lt;br&amp;gt;&lt;br /&gt;
4. Delete &amp;quot;Harddrive 2&amp;quot; (Hardrive file xxx/xxx_1.vmdk)&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 hd-boot.vmdk  &amp;gt; xxx.vmdk&lt;br /&gt;
 hd-cf.vmdk    &amp;gt; xxx_1.vmdk&lt;br /&gt;
 hd-flash.vmdk &amp;gt; xxx_2.vmdk&lt;br /&gt;
 hd-dump.vmdk  &amp;gt; xxx_3.vmdk&lt;br /&gt;
&lt;br /&gt;
5. Create new harddrive&amp;lt;br&amp;gt;&lt;br /&gt;
6. Configure the required size&amp;lt;br&amp;gt;&lt;br /&gt;
7. As &amp;quot;Node of virtual device&amp;quot; select &amp;quot;IDE(0:1)&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
8. Start the IPVA.&amp;lt;br&amp;gt;&lt;br /&gt;
9. &amp;quot;Format&amp;quot; the CF Card and &amp;quot;mount&amp;quot; it (General/Compact-Flash/General)&lt;br /&gt;
&lt;br /&gt;
===What Is The Size Of the emulated Flash Storage on the IPVA?===&lt;br /&gt;
The virtual flash storage used to store configuration file of the IPVA and LDAP directory of the PBX is defined with 64 MB and can not be changed. This is two times more than on IP6010. The VMDK-File hd-flash.vmdk is allocated with 100 MB, because VMWare can not handle smaller virtual disks.&lt;br /&gt;
&lt;br /&gt;
===What Is The Size Of the Flash Directory on the IPVA?===&lt;br /&gt;
As noted above, the virtual flash memory on the IPVA is fixed to a size of 64MB.  Most of the flash is used by the &#039;&#039;flash directory&#039;&#039; (FLASHDIR0) which amongst other things provides storage for PBX objects.&lt;br /&gt;
&lt;br /&gt;
The size of the flash directory depends on the available RAM. The maximum of 900 segments á 64KB, i.e. ~56MB, is available if 192MB or more RAM is available. If less RAM is available, the size of the flash directory is decreased accordingly.  For this reason, it is unsafe to reduce RAM size in a given IPVA, as the flash directory size may be decreased so that objects from the flash directory get lost.&lt;br /&gt;
&lt;br /&gt;
The easiest method to see how much flash directory space is available is to investigate the boot trace. For the standard configuration of 64MB the respective trace output is going to look as follows and informs about a size of 14MB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code type=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0:0000:081:4 - start flashdir FLASHDIR0&lt;br /&gt;
0:0000:081:4 - fdir: segments=901-&amp;gt;224(14.0MB)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How Much RAM Is Required Per IPVA Instance?===&lt;br /&gt;
Since 12r2sr27/13r1sr5 the downloadable virtual appliance comes preconfigured with 256MB RAM. This amount is seen as a good trade-off for the majority of all installations.&lt;br /&gt;
The RAM-size can be administrated by VMware-means.&lt;br /&gt;
&lt;br /&gt;
The minimum RAM size allocatable to an IPVA in VMware is 20MB.  This results in a DRAM size seen by the IPVA of 17MB and roughly 8MB allocatable runtime memory after boot.  Note though that even a small IP302 model has 17MB allocatable runtime memory after boot.&lt;br /&gt;
&lt;br /&gt;
===What Is The Maximum Amount Of RAM?===&lt;br /&gt;
The maximum meaningful RAM setting is 3GB. Memory space beyond that limit will be left unused. Assigning more than 3GB to an IPVA instance doesn&#039;t provide any benefit.&lt;br /&gt;
&lt;br /&gt;
===Why Does &#039;&#039;General/Info/DRAM&#039;&#039; Show Less Than the Configured Memory?===&lt;br /&gt;
Not all of the configured memory is available to the IPVA. E.g. a bit of memory is occupied by the VMM&amp;lt;ref&amp;gt;Virtual Machine Monitor: A component belonging to the virtualization platform&amp;lt;/ref&amp;gt;. The indicator &#039;&#039;General/Info/DRAM&#039;&#039; displays the memory available to the IPVA and is truncated down to a whole number. A boot-trace reveals a bit more about IPVA-available memory as shown in the following excerpt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
0:0000:030:4 - Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz&lt;br /&gt;
0:0000:030:4 - mem(64946176)=61.93MB ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How Many IPVA Instances Are Possible Per Host?===&lt;br /&gt;
There&#039;s no worst-case estimate available. For a best-case calculation, &lt;br /&gt;
*see [http://www.vmware.com/pdf/vsphere4/r41/vsp_41_config_max.pdf  Configuration Maximums VMware vSphere 4.1]&lt;br /&gt;
*see [[#How_Much_RAM_Is_Required_Per_IPVA_Instance.3F | How Much RAM Is Required Per IPVA Instance?]]&lt;br /&gt;
Additional preformance reflections&lt;br /&gt;
*see [[HOWTO:A_rough_estimate_of_IPVA_Performance | A rough estimate of IPVA Performance]]&lt;br /&gt;
&lt;br /&gt;
===How do I perform a factory reset?===&lt;br /&gt;
&lt;br /&gt;
replace the 3rd disk, served on IDE 1:0, named hd-flash.vmdk with an empty disk:&lt;br /&gt;
&lt;br /&gt;
[[Image:VM_Settings.png]]&lt;br /&gt;
&lt;br /&gt;
1)download the IPVA and watch out for the file hd-flash.vmdk&lt;br /&gt;
&lt;br /&gt;
2)Power-off the IPVA instance&lt;br /&gt;
&lt;br /&gt;
3)Replace hd-flash.vmdk with the one downloaded in step 1). If on vsphere it may have been assigned a different name. Ensure it’s the one on IDE 1:0.&lt;br /&gt;
&lt;br /&gt;
4)Power-on the IPVA instance&lt;br /&gt;
&lt;br /&gt;
===What About VMware Tools?===&lt;br /&gt;
VMware Tools are not supported.&lt;br /&gt;
&lt;br /&gt;
===What Is The Console Good For?===&lt;br /&gt;
The console is a remains of the early development phase. It resembles the IP3000&#039;s serial console. It doesn&#039;t offer any convenience like command history or backspace funtionality. Nevertheless may the console be of help in exceptional situations where e.g. the required DHCP server isn&#039;t available for 1st-time configuration or in situations where the ip configuration was misconfigured. Thereby any command from a device&#039;s config is acceptable. &lt;br /&gt;
&lt;br /&gt;
For instance to configure the static IP address 1.2.3.4/24 on ETH0:&lt;br /&gt;
*Click into the console&lt;br /&gt;
*Press ENTER&lt;br /&gt;
*Enter credentials&lt;br /&gt;
*Enter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config change IP0 ETH0 /addr 1.2.3.4 /mask 255.255.255.0&lt;br /&gt;
config change DHCP0 /mode off&lt;br /&gt;
config write&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Since no backspace is offered it may become a daring task to enter a single line without typos. In case of a typo hit ENTER and input the same line again.&lt;br /&gt;
The keyboard layout is the US layout.&lt;br /&gt;
[[Image:Ip-via-console.png|center|thumb|200px|Console-edit of IP address]]&lt;br /&gt;
&lt;br /&gt;
Display the IP configuration for ETH0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config show IP0 ETH0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Display the DHCP configuration for ETH0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config show DHCP0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional the DNS-server(s) and the default gateway can be configured:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config change IP0 ETH0 /addr 1.2.3.4 /mask 255.255.255.0 /dns 8.8.8.8 /dns2 8.8.4.4&lt;br /&gt;
config change IP0 RT0 /gateway 1.2.3.254&lt;br /&gt;
config change DHCP0 /mode off&lt;br /&gt;
config write&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also some simple diagnostics (ping and traceroute) are possible via the console (output is given in the console):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mod cmd PING0 tracert 8.8.8.8&lt;br /&gt;
mod cmd PING0 ping 8.8.8.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resetting the entire FLASH space - &#039;&#039;&#039;Note, all configuration will get lost&#039;&#039;&#039;. this is similar method to the manufacturer reset method from above [[#How_do_I_perform_a_factory_reset.3F|How do I perform a factory reset?]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mod cmd FLASHMAN0 reset all&lt;br /&gt;
reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of A Checksum Boot Error?===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
checksum wrong! Loading failed for image=IPVA    BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:ipva-crc-wrong.jpg|center|thumb|200px|Console displays CRC boot error]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&lt;br /&gt;
*Power-off the IPVA&lt;br /&gt;
*Replace the boot harddisk by a fresh one. The boot harddisk is the 1st hd(originally named &#039;&#039;hd-boot.vmdk&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This problem may occur on a system crash while a firmware update is taking place.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;NIC unavailable!&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIC unavailable!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:ipva-nic-unavailable.jpg|center|thumb|200px|Console displays &#039;&#039;NIC unavailable!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&lt;br /&gt;
*Power-off the IPVA&lt;br /&gt;
*Administrate by VMware means: Ensure the correct/expected type of network interface controller(NIC) is going to be offered by the hypervisor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IPVA offers driver support for:&lt;br /&gt;
*AMD NIC: Am79C970A PCnet-PCI II Single-Chip Full-Duplex Ethernet Controller&lt;br /&gt;
**a.k.a &#039;&#039;PCNet32&#039;&#039;&lt;br /&gt;
**a.k.a &#039;&#039;Vlance&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The AMD-NIC is kind of default. However, the NIC type may be overriden manually and accordingly within the configuration file ipva.vmx as follows&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ethernet0.virtualDev = &amp;quot;vlance&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This problem may occur after a VMware re-configuration of the network settings.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;perf-counter not enabled!&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
perfcounter-not enabled!!!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:screenshot-ipva-perfcounter-nok.jpg|center|thumb|200px|Console displays &#039;&#039;perfcounter-not enabled!!!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
This problem is likely caused by an OVA-import of the IPVA. The appliance&#039;s configuration file &#039;&#039;ipva.vmx&#039;&#039; requires a VMware proprietary configuration line that&#039;s not specifiable within an OVA-file. &lt;br /&gt;
&lt;br /&gt;
The IPVA utilizes a VMware proprietary mechanism for its internal timekeeping&amp;lt;ref&amp;gt;Timekeeping in Virtual Machines http://www.vmware.com/pdf/vmware_timekeeping.pdf&amp;lt;/ref&amp;gt;. That mechanism is only available after adding the following line to the configuration file &#039;&#039;ipva.vmx&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
monitor_control.pseudo_perfctr = TRUE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If that line is not present, the hypervisor is going to throw a CPU exception. Hint: In vSphere a VMX-file can be edited under &#039;&#039;&#039;Edit Settings/Options/Advanced/General/Configuration Parameters&#039;&#039;&#039;&amp;lt;ref&amp;gt;vmware Labs - How to edit vmx file in ESXi vSphere: https://www.youtube.com/watch?v=ICICoq-maB0&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
*The vmx file should be edited after the installation of the IPVA.&lt;br /&gt;
*The vmx file should NOT be edited with Text editor (use vSphere as shown above)&lt;br /&gt;
*To our knowledge, a converter is always necessary for the installation with vmx.&lt;br /&gt;
&lt;br /&gt;
===What Can I Do In Case Of Boot-Problem: &#039;&#039;Loading failed for image=IPVA    BIN&#039;&#039;===&lt;br /&gt;
This paragraph applies, if you experience the following start-up problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Symptom&#039;&#039;&#039;&lt;br /&gt;
*the IPVA doesn&#039;t start properly&lt;br /&gt;
*the console displays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Loading failed for image=IPVA    BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Ipva-fw-load-failed.png|center|thumb|200px|Console displays &#039;&#039;Loading failed for image=IPVA    BIN&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
This problem is likely caused by a calculation fault within the boot-code. &lt;br /&gt;
*The solution requires a replacement of the boot disk hd-boot.vmdk. &lt;br /&gt;
**Download an IPVA package from on 11r2 sr22.&lt;br /&gt;
**Replace the 1st disk with the one from the downloaded package&lt;br /&gt;
&lt;br /&gt;
===Are Additional vCPUs useful?===&lt;br /&gt;
The Multi-Core functionality of version 13r2 is a beta functionality. Additional virtual CPUs(vCPUs) should not be utilized in production environments.&lt;br /&gt;
&lt;br /&gt;
===How To Replace The Boot Disk On vSphere?===&lt;br /&gt;
The recommended way is as follows:&lt;br /&gt;
*With ipva.ova deploy a fresh IPVA by means of &#039;&#039;&#039;File/Deploy OVF-Template...&#039;&#039;&#039; (de: &#039;&#039;&#039;Datei/OFV-Vorlage bereitstellen...&#039;&#039;&#039;) and follow instructions.&lt;br /&gt;
**Its use to just serve as a copy source.&lt;br /&gt;
*Power-Off the old IPVA.&lt;br /&gt;
*In the old IPVA remove the 1st disk on IDE 0:0.&lt;br /&gt;
*From the new IPVA copy the 1st harddisk(on IDE 0:0) towards the old IPVA&#039;s directory.&lt;br /&gt;
*In the old IPVA add the 1st disk on IDE 0:0.&lt;br /&gt;
*In the old IPVA confirm and start the machine&lt;br /&gt;
&lt;br /&gt;
===What do the counters mean under Interface/Ethx/Statistic?===&lt;br /&gt;
;rx-drop: Accumulates register CSR112 &amp;lt;ref&amp;gt;Command and Status Register&amp;lt;/ref&amp;gt; of the emulated chip AM79C970. CSR112: Missed Frame Count. An increase of this value indicates the IPVA was not able to process the network frames fast enough.&lt;br /&gt;
;ifInDiscards: Sum of rx-drop, frames dropped due to interface link not up, unsupported ethernet type, internal receive queue full, drop frames of different vlan, drop non vlan frames if vlan is configured&lt;br /&gt;
;rx-frame-blocked: Unsupported IP protocol&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
[[Reference10:Licenses]]&lt;br /&gt;
&lt;br /&gt;
[[Howto:A_rough_estimate_of_IPVA_Performance | Howto:A_rough_estimate_of_IPVA_Performance]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept|Innovaphone Virtual Appliance]]&lt;/div&gt;</summary>
		<author><name>Inno-mst</name></author>
	</entry>
</feed>