98_telnet.pm 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. ##############################################
  2. # $Id: 98_telnet.pm 16293 2018-02-28 21:33:57Z rudolfkoenig $
  3. # Note: this is not really a telnet server, but a TCP server with slight telnet
  4. # features (disable echo on password)
  5. package main;
  6. use strict;
  7. use warnings;
  8. use TcpServerUtils;
  9. ##########################
  10. sub
  11. telnet_Initialize($)
  12. {
  13. my ($hash) = @_;
  14. $hash->{DefFn} = "telnet_Define";
  15. $hash->{ReadFn} = "telnet_Read";
  16. $hash->{AsyncOutputFn} = "telnet_Output";
  17. $hash->{UndefFn} = "telnet_Undef";
  18. $hash->{AttrFn} = "telnet_Attr";
  19. $hash->{AttrList} = "globalpassword password prompt allowedCommands ".
  20. "allowfrom SSL connectTimeout connectInterval ".
  21. "encoding:utf8,latin1 sslVersion";
  22. $hash->{ActivateInformFn} = "telnet_ActivateInform";
  23. $cmds{encoding} = { Fn=>"CommandTelnetEncoding",
  24. ClientFilter => "telnet",
  25. Hlp=>"[utf8|latin1],query and set the character encoding ".
  26. "for the current telnet session" };
  27. $cmds{inform} = { Fn=>"CommandTelnetInform",
  28. ClientFilter => "telnet",
  29. Hlp=>"{on|onWithState|off|log|raw|timer|status},".
  30. "echo all events to this client" };
  31. }
  32. sub
  33. CommandTelnetEncoding($$)
  34. {
  35. my ($hash, $param) = @_;
  36. my $ret = "";
  37. if( !$param ) {
  38. $ret = "current encoding is $hash->{encoding}";
  39. } elsif( $param eq "utf8" || $param eq "latin1" ) {
  40. $hash->{encoding} = $param;
  41. syswrite($hash->{CD}, sprintf("%c%c%c", 255, 253, 0) );
  42. $ret = "encoding changed to $param";
  43. } else {
  44. $ret = "unknown encoding >>$param<<";
  45. }
  46. return $ret;
  47. }
  48. ##########################
  49. sub
  50. telnet_ClientConnect($)
  51. {
  52. my ($hash) = @_;
  53. my $name = $hash->{NAME};
  54. $hash->{DEF} =~ m/^(IPV6:)?(.*):(\d+)$/;
  55. my ($isIPv6, $server, $port) = ($1, $2, $3);
  56. Log3 $name, 4, "$name: Connecting to $server:$port...";
  57. my @opts = (
  58. PeerAddr => "$server:$port",
  59. Timeout => AttrVal($name, "connectTimeout", 2),
  60. );
  61. my $client;
  62. if($hash->{SSL}) {
  63. $client = IO::Socket::SSL->new(@opts);
  64. } else {
  65. $client = IO::Socket::INET->new(@opts);
  66. }
  67. if($client) {
  68. $hash->{FD} = $client->fileno();
  69. $hash->{CD} = $client; # sysread / close won't work on fileno
  70. $hash->{BUF} = "";
  71. $hash->{CONNECTS}++;
  72. $selectlist{$name} = $hash;
  73. $hash->{STATE} = "Connected";
  74. RemoveInternalTimer($hash);
  75. Log3 $name, 3, "$name: connected to $server:$port";
  76. } else {
  77. telnet_ClientDisconnect($hash, 1);
  78. }
  79. }
  80. ##########################
  81. sub
  82. telnet_ClientDisconnect($$)
  83. {
  84. my ($hash, $connect) = @_;
  85. my $name = $hash->{NAME};
  86. close($hash->{CD}) if($hash->{CD});
  87. delete($hash->{FD});
  88. delete($hash->{CD});
  89. delete($selectlist{$name});
  90. $hash->{STATE} = "Disconnected";
  91. InternalTimer(gettimeofday()+AttrVal($name, "connectInterval", 60),
  92. "telnet_ClientConnect", $hash, 0);
  93. if($connect) {
  94. Log3 $name, 4, "$name: Connect failed.";
  95. } else {
  96. Log3 $name, 3, "$name: Disconnected";
  97. }
  98. }
  99. ##########################
  100. sub
  101. telnet_Define($$$)
  102. {
  103. my ($hash, $def) = @_;
  104. my @a = split("[ \t][ \t]*", $def);
  105. my ($name, $type, $pport, $global) = split("[ \t]+", $def);
  106. my $port = $pport;
  107. $port =~ s/^IPV6://;
  108. my $isServer = 1 if(defined($port) && $port =~ m/^\d+$/);
  109. my $isClient = 1 if($port && $port =~ m/^(.+):\d+$/);
  110. return "Usage: define <name> telnet { [IPV6:]<tcp-portnr> [global] | ".
  111. " [IPV6:]serverName:port }"
  112. if(!($isServer || $isClient) ||
  113. ($isClient && $global));
  114. # Make sure that fhem only runs once
  115. if($isServer) {
  116. my $ret = TcpServer_Open($hash, $pport, $global);
  117. if($ret && !$init_done) {
  118. Log3 $name, 1, "$ret. Exiting.";
  119. exit(1);
  120. }
  121. return $ret;
  122. }
  123. if($isClient) {
  124. $hash->{isClient} = 1;
  125. telnet_ClientConnect($hash);
  126. }
  127. }
  128. ##########################
  129. sub
  130. telnet_Read($)
  131. {
  132. my ($hash) = @_;
  133. my $name = $hash->{NAME};
  134. if($hash->{SERVERSOCKET}) { # Accept and create a child
  135. my $chash = TcpServer_Accept($hash, "telnet");
  136. return if(!$chash);
  137. $chash->{canAsyncOutput} = 1;
  138. $chash->{encoding} = AttrVal($name, "encoding", "utf8");
  139. $chash->{prompt} = AttrVal($name, "prompt",
  140. AttrVal('global','title','fhem'));
  141. if($chash->{prompt} =~ m/^{.*}$/s) {
  142. $chash->{prompt} = eval $chash->{prompt};
  143. $chash->{prompt} =~ s/\n//;
  144. }
  145. $chash->{prompt} .= '>'; # Not really nice, but dont know better.
  146. syswrite($chash->{CD}, sprintf("%c%c%c", 255, 253, 0) )
  147. if( AttrVal($name, "encoding", "") ); #DO BINARY
  148. $chash->{CD}->flush();
  149. my $auth = Authenticate($chash, undef);
  150. syswrite($chash->{CD}, sprintf("%c%c%cPassword: ", 255, 251, 1)) # WILL ECHO
  151. if($auth);
  152. $chash->{Authenticated} = 0 if(!$auth);
  153. return;
  154. }
  155. my $buf;
  156. my $ret = sysread($hash->{CD}, $buf, 256);
  157. if(!defined($ret) || $ret <= 0) {
  158. if($hash->{isClient}) {
  159. telnet_ClientDisconnect($hash, 0);
  160. } else {
  161. delete $hash->{canAsyncOutput};
  162. CommandDelete(undef, $name);
  163. }
  164. return;
  165. }
  166. if(ord($buf) == 4) { # EOT / ^D
  167. CommandQuit($hash, "");
  168. return;
  169. }
  170. $buf =~ s/\r//g;
  171. my $sname = ($hash->{isClient} ? $name : $hash->{SNAME});
  172. if(!defined($hash->{Authenticated}) || $hash->{Authenticated}) {
  173. $buf =~ s/\xff..//g; # Telnet IAC stuff
  174. $buf =~ s/\xfd(.)//; # Telnet Do ?
  175. syswrite($hash->{CD}, sprintf("%c%c%c", 0xff, 0xfc, ord($1)))
  176. if(defined($1)) # Wont / ^C handling
  177. }
  178. $hash->{BUF} .= $buf;
  179. my @ret;
  180. my $gotCmd;
  181. while($hash->{BUF} =~ m/\n/) {
  182. my ($cmd, $rest) = split("\n", $hash->{BUF}, 2);
  183. $hash->{BUF} = $rest;
  184. if(!defined($hash->{Authenticated})) {
  185. syswrite($hash->{CD}, sprintf("%c%c%c\r\n", 255, 252, 1)); # WONT ECHO
  186. if(Authenticate($hash, $cmd) != 2) {
  187. $hash->{Authenticated} = 1;
  188. next;
  189. } else {
  190. if($hash->{isClient}) {
  191. telnet_ClientDisconnect($hash, 0);
  192. } else {
  193. delete($hash->{rcvdQuit});
  194. CommandDelete(undef, $name);
  195. }
  196. return;
  197. }
  198. }
  199. $gotCmd = 1;
  200. if($cmd) {
  201. if($cmd =~ m/\\ *$/) { # Multi-line
  202. $cmd =~ s/\\ *$//;
  203. $hash->{prevlines} .= $cmd . "\n";
  204. } else {
  205. if($hash->{prevlines}) {
  206. $cmd = $hash->{prevlines} . $cmd;
  207. undef($hash->{prevlines});
  208. }
  209. $cmd = latin1ToUtf8($cmd) if( $hash->{encoding} eq "latin1" );
  210. $ret = AnalyzeCommandChain($hash, $cmd);
  211. push @ret, $ret if(defined($ret));
  212. }
  213. } else {
  214. $hash->{showPrompt} = 1; # Empty return
  215. if(!$hash->{motdDisplayed}) {
  216. my $motd = $attr{global}{motd};
  217. push @ret, $motd if($motd && $motd ne "none");
  218. $hash->{motdDisplayed} = 1;
  219. }
  220. }
  221. next if($rest);
  222. }
  223. $ret = "";
  224. $ret .= (join("\n", @ret) . "\n") if(@ret);
  225. $ret .= ($hash->{prevlines} ? "> " : $hash->{prompt}." ")
  226. if($gotCmd && $hash->{showPrompt} && !$hash->{rcvdQuit});
  227. $ret =~ s/\n/\r\n/g if($hash->{Authenticated}); # only for DOS telnet
  228. telnet_Output($hash, $ret, 1);
  229. if($hash->{rcvdQuit}) {
  230. if($hash->{isClient}) {
  231. delete($hash->{rcvdQuit});
  232. telnet_ClientDisconnect($hash, 0);
  233. } else {
  234. CommandDelete(undef, $name);
  235. }
  236. }
  237. }
  238. sub
  239. telnet_Output($$$)
  240. {
  241. my ($hash,$ret,$nonl) = @_;
  242. if($ret) {
  243. $ret = utf8ToLatin1($ret) if( $hash->{encoding} eq "latin1" );
  244. if(!$nonl) { # AsyncOutput stuff
  245. $ret = "\n$ret\n$hash->{prompt} " if( $hash->{showPrompt});
  246. $ret = "$ret\n" if(!$hash->{showPrompt});
  247. }
  248. for(;;) {
  249. utf8::encode($ret) if(utf8::is_utf8($ret) && $ret =~ m/[^\x00-\xFF]/);
  250. my $l = syswrite($hash->{CD}, $ret);
  251. last if(!$l || $l == length($ret));
  252. $ret = substr($ret, $l);
  253. }
  254. $hash->{CD}->flush();
  255. }
  256. return undef;
  257. }
  258. ##########################
  259. sub
  260. telnet_Attr(@)
  261. {
  262. my ($type, $devName, $attrName, @param) = @_;
  263. my @a = @_;
  264. my $hash = $defs{$devName};
  265. if($type eq "set" && $attrName eq "SSL") {
  266. TcpServer_SetSSL($hash);
  267. if($hash->{CD}) {
  268. my $ret = IO::Socket::SSL->start_SSL($hash->{CD});
  269. Log3 $devName, 1, "$hash->{NAME} start_SSL: $ret" if($ret);
  270. }
  271. }
  272. if(($attrName eq "allowedCommands" ||
  273. $attrName eq "password" ||
  274. $attrName eq "globalpassword" ) && $type eq "set") {
  275. my $aName = "allowed_$devName";
  276. my $exists = ($defs{$aName} ? 1 : 0);
  277. AnalyzeCommand(undef, "defmod $aName allowed");
  278. AnalyzeCommand(undef, "attr $aName validFor $devName");
  279. AnalyzeCommand(undef, "attr $aName $attrName ".join(" ",@param));
  280. return "$devName: ".($exists ? "modifying":"creating").
  281. " device $aName for attribute $attrName";
  282. }
  283. return undef;
  284. }
  285. sub
  286. telnet_Undef($$)
  287. {
  288. my ($hash, $arg) = @_;
  289. delete($logInform{$hash->{NAME}});
  290. delete($inform{$hash->{NAME}});
  291. return TcpServer_Close($hash);
  292. }
  293. #####################################
  294. sub
  295. CommandTelnetInform($$)
  296. {
  297. my ($cl, $param) = @_;
  298. return if(!$cl);
  299. my $name = $cl->{NAME};
  300. return "Usage: inform {on|onWithState|off|raw|timer|log|status} [regexp]"
  301. if($param !~ m/^(on|onWithState|off|raw|timer|log|status)/);
  302. if($param eq "status") {
  303. my $i = $inform{$name};
  304. return $i ? ($i->{type} . ($i->{regexp} ? " ".$i->{regexp} : "")) : "off";
  305. }
  306. if($param eq "off") {
  307. delete($logInform{$name});
  308. delete($inform{$name});
  309. } elsif($param eq "log") {
  310. $logInform{$name} = sub($$){
  311. my ($me, $msg) = @_; # _NO_ Log3 here!
  312. telnet_Output($defs{$me}, $msg."\n", 1);
  313. }
  314. } elsif($param ne "off") {
  315. my ($type, $regexp) = split(" ", $param);
  316. $inform{$name}{NR} = $cl->{NR};
  317. $inform{$name}{type} = $type;
  318. if($regexp) {
  319. eval { "Hallo" =~ m/$regexp/ };
  320. return "Bad regexp: $@" if($@);
  321. $inform{$name}{regexp} = $regexp;
  322. }
  323. Log 4, "Setting inform to $param";
  324. }
  325. return undef;
  326. }
  327. sub
  328. telnet_ActivateInform($)
  329. {
  330. my ($cl) = @_;
  331. CommandTelnetInform($cl, "log");
  332. }
  333. 1;
  334. =pod
  335. =item helper
  336. =item summary telnet server for FHEM
  337. =item summary_DE FHEM telnet Server
  338. =begin html
  339. <a name="telnet"></a>
  340. <h3>telnet</h3>
  341. <ul>
  342. <br>
  343. <a name="telnetdefine"></a>
  344. <b>Define</b>
  345. <ul>
  346. <code>define &lt;name&gt; telnet &lt;portNumber&gt;
  347. [global|hostname]</code><br>
  348. or<br>
  349. <code>define &lt;name&gt; telnet &lt;servername&gt;:&lt;portNumber&gt;</code>
  350. <br><br>
  351. First form, <b>server</b> mode:<br>
  352. Listen on the TCP/IP port <code>&lt;portNumber&gt;</code> for incoming
  353. connections. If the second parameter is <b>not</b> specified,
  354. the server will only listen to localhost connections. If the second
  355. parameter is global, telnet will listen on all interfaces, else it wil try
  356. to resolve the parameter as a hostname, and listen only on this interface.
  357. <br>
  358. To use IPV6, specify the portNumber as IPV6:&lt;number&gt;, in this
  359. case the perl module IO::Socket:INET6 will be requested.
  360. On Linux you may have to install it with cpan -i IO::Socket::INET6 or
  361. apt-get libio-socket-inet6-perl; OSX and the FritzBox-7390 perl already has
  362. this module.<br>
  363. Examples:
  364. <ul>
  365. <code>define tPort telnet 7072 global</code><br>
  366. <code>attr tPort SSL</code><br>
  367. <code>attr allowed_tPort allowed</code><br>
  368. <code>attr allowed_tPort validFor tPort</code><br>
  369. <code>attr allowed_tPort globalpassword mySecret</code><br>
  370. </ul>
  371. Note: The old global attribute port is automatically converted to a
  372. telnet instance with the name telnetPort. The global allowfrom attibute is
  373. lost in this conversion.
  374. <br><br>
  375. Second form, <b>client</b> mode:<br>
  376. Connect to the specified server port, and execute commands received from
  377. there just like in server mode. This can be used to connect to a fhem
  378. instance sitting behind a firewall, when installing exceptions in the
  379. firewall is not desired or possible. Note: this client mode supprts SSL,
  380. but not IPV6.<br>
  381. Example:
  382. <ul>
  383. Start tcptee first on publicly reachable host outside the firewall.<ul>
  384. perl contrib/tcptee.pl --bidi 3000</ul>
  385. Configure fhem inside the firewall:<ul>
  386. define tClient telnet &lt;tcptee_host&gt;:3000</ul>
  387. Connect to the fhem from outside of the firewall:<ul>
  388. telnet &lt;tcptee_host&gt; 3000</ul>
  389. </ul>
  390. </ul>
  391. <br>
  392. <a name="telnetset"></a>
  393. <b>Set</b> <ul>N/A</ul><br>
  394. <a name="telnetget"></a>
  395. <b>Get</b> <ul>N/A</ul><br>
  396. <a name="telnetattr"></a>
  397. <b>Attributes:</b>
  398. <ul>
  399. <a name="prompt"></a>
  400. <li>prompt<br>
  401. Sets the string for the telnet prompt, the default is fhem&gt;
  402. </li><br>
  403. <a name="SSL"></a>
  404. <li>SSL<br>
  405. Enable SSL encryption of the connection, see the description <a
  406. href="#HTTPS">here</a> on generating the needed SSL certificates. To
  407. connect to such a port use one of the following commands:
  408. <ul>
  409. socat openssl:fhemhost:fhemport,verify=0 readline<br>
  410. ncat --ssl fhemhost fhemport<br>
  411. openssl s_client -connect fhemhost:fhemport<br>
  412. </ul>
  413. </li><br>
  414. <a name="allowfrom"></a>
  415. <li>allowfrom<br>
  416. Regexp of allowed ip-addresses or hostnames. If set, only connections
  417. from these addresses are allowed.<br>
  418. NOTE: if this attribute is not defined and there is no valid allowed
  419. device defined for the telnet/FHEMWEB instance and the client tries to
  420. connect from a non-local net, then the connection is refused. Following
  421. is considered a local net:<br>
  422. <ul>
  423. IPV4: 127/8, 10/8, 192.168/16, 172.16/10, 169.254/16<br>
  424. IPV6: ::1, fe80/10<br>
  425. </ul>
  426. </li><br>
  427. <a name="connectTimeout"></a>
  428. <li>connectTimeout<br>
  429. Wait at maximum this many seconds for the connection to be established.
  430. Default is 2.
  431. </li><br>
  432. <a name="connectInterval"></a>
  433. <li>connectInterval<br>
  434. After closing a connection, or if a connection cannot be estblished,
  435. try to connect again after this many seconds. Default is 60.
  436. </li><br>
  437. <a name="encoding"></a>
  438. <li>encoding<br>
  439. Sets the encoding for the data send to the client. Possible values are
  440. latin1 and utf8. Default is utf8.
  441. </li><br>
  442. <li>sslVersion<br>
  443. See the global attribute sslVersion.
  444. </li><br>
  445. </ul>
  446. </ul>
  447. =end html
  448. =begin html_DE
  449. <a name="telnet"></a>
  450. <h3>telnet</h3>
  451. <ul>
  452. <br>
  453. <a name="telnetdefine"></a>
  454. <b>Define</b>
  455. <ul>
  456. <code>define &lt;name&gt; telnet &lt;portNumber&gt;
  457. [global|hostname]</code><br> oder<br>
  458. <code>define &lt;name&gt; telnet &lt;servername&gt;:&lt;portNummer&gt;</code>
  459. <br><br>
  460. Erste Form, <b>Server</b>-mode:<br>
  461. &Uuml;berwacht den TCP/IP-Port <code>&lt;portNummer&gt;</code> auf
  462. ankommende Verbindungen. Wenn der zweite Parameter <b>nicht</b>
  463. angegeben wird, wird der Server nur auf Verbindungen von localhost achten.
  464. Falls der zweite Parameter global ist, dann wird telnet auf allen lokalen
  465. Netzwerk-Interfaces zuh&ouml;ren, ansonsten wird der Parameter als Hostname
  466. oder Adresse interpretiert, und nur diese lokale Adresse bedient.
  467. <br>
  468. F&uuml;r den Gebrauch von IPV6 muss die Portnummer als IPV6:&lt;nummer&gt;
  469. angegeben werden, in diesem Fall wird das Perl-Modul IO::Socket:INET6
  470. angesprochen. Unter Linux kann es sein, dass dieses Modul mittels cpan -i
  471. IO::Socket::INET6 oder apt-get libio-socket-inet6-perl nachinstalliert werden
  472. muss; OSX und Fritzbox-7390 enthalten bereits dieses Modul.<br>
  473. Beispiele:
  474. <ul>
  475. <code>define tPort telnet 7072 global</code><br>
  476. <code>attr tPort SSL</code><br>
  477. <code>attr allowed_tPort allowed</code><br>
  478. <code>attr allowed_tPort validFor tPort</code><br>
  479. <code>attr allowed_tPort globalpassword mySecret</code><br>
  480. </ul>
  481. Hinweis: Das alte (pre 5.3) "global attribute port" wird automatisch in
  482. eine telnet-Instanz mit dem Namen telnetPort umgewandelt. Im Rahmen dieser
  483. Umwandlung geht das globale Attribut allowfrom verloren.
  484. <br><br>
  485. Zweite Form, <b>Client</b>-mode:<br>
  486. Verbindet zu einem angegebenen Server-Port und f&uuml;hrt die von dort aus
  487. empfangenen Anweisungen - genau wie im Server-mode - aus. Dies kann
  488. verwendet werden, um sich mit einer fhem-Instanz, die sich hinter einer
  489. Firewall befindet, zu verbinden, f&uuml;r den Fall, wenn das Installieren
  490. von Ausnahmen in der Firewall nicht erw&uuml;nscht oder nicht m&ouml;glich
  491. sind. Hinweis: Dieser Client-mode unterst&uuml;tzt zwar SSL, aber nicht
  492. IPV6.<br>
  493. Beispiel:
  494. <ul>
  495. Starten von tcptee auf einem &ouml;ffentlich erreichbaren Host ausserhalb
  496. der Firewall:<ul>
  497. <code>perl contrib/tcptee.pl --bidi 3000</code></ul>
  498. Konfigurieren von fhem innerhalb der Firewall:<ul>
  499. <code>define tClient telnet &lt;tcptee_host&gt;:3000</code></ul>
  500. Verbinden mit fhem (hinter der Firewall) von ausserhalb der Firewall:<ul>
  501. <code>telnet &lt;tcptee_host&gt; 3000</code></ul>
  502. </ul>
  503. </ul>
  504. <br>
  505. <a name="telnetset"></a>
  506. <b>Set</b> <ul>N/A</ul><br>
  507. <a name="telnetget"></a>
  508. <b>Get</b> <ul>N/A</ul><br>
  509. <a name="telnetattr"></a>
  510. <b>Attribute</b>
  511. <ul>
  512. <a name="prompt"></a>
  513. <li>prompt<br>
  514. Gibt die Zeichenkette an, welche in der Telnet-Sitzung als
  515. Kommandoprompt ausgegeben wird. Die Voreinstellung ist fhem&gt;
  516. </li><br>
  517. <a name="SSL"></a>
  518. <li>SSL<br>
  519. SSL-Verschl&uuml;sselung f&uuml;r eine Verbindung aktivieren. <a
  520. href="#HTTPS">Hier</a> gibt es eine Beschreibung, wie das erforderliche
  521. SSL-Zertifikat generiert werden kann. Um eine Verbindung mit solch
  522. einem Port herzustellen, sind folgende Befehle m&ouml;glich:
  523. <ul>
  524. <code>
  525. socat openssl:fhemhost:fhemport,verify=0 readline<br>
  526. ncat --ssl fhemhost fhemport<br>
  527. openssl s_client -connect fhemhost:fhemport<br>
  528. </code>
  529. </ul>
  530. </li><br>
  531. <a name="allowfrom"></a>
  532. <li>allowfrom<br>
  533. Regexp der erlaubten IP-Adressen oder Hostnamen. Wenn dieses Attribut
  534. gesetzt wurde, werden ausschlie&szlig;lich Verbindungen von diesen
  535. Adressen akzeptiert.<br>
  536. Achtung: falls allowfrom nicht gesetzt ist, und keine g&uuml;tige
  537. allowed Instanz definiert ist, und die Gegenstelle eine nicht lokale
  538. Adresse hat, dann wird die Verbindung abgewiesen. Folgende Adressen
  539. werden als local betrachtet:
  540. <ul>
  541. IPV4: 127/8, 10/8, 192.168/16, 172.16/10, 169.254/16<br>
  542. IPV6: ::1, fe80/10<br>
  543. </ul>
  544. </li><br>
  545. <a name="connectTimeout"></a>
  546. <li>connectTimeout<br>
  547. Gibt die maximale Wartezeit in Sekunden an, in der die Verbindung
  548. aufgebaut sein muss. Standardwert ist 2.
  549. </li><br>
  550. <a name="connectInterval"></a>
  551. <li>connectInterval<br>
  552. Gibt die Dauer an, die entweder nach Schlie&szlig;en einer Verbindung
  553. oder f&uuml;r den Fall, dass die Verbindung nicht zustande kommt,
  554. gewartet werden muss, bis ein erneuter Verbindungsversuch gestartet
  555. werden soll. Standardwert ist 60.
  556. </li><br>
  557. <a name="encoding"></a>
  558. <li>encoding<br>
  559. Bezeichnet die Zeichentabelle f&uuml;r die zum Client gesendeten Daten.
  560. M&ouml;gliche Werte sind utf8 und latin1. Standardwert ist utf8.
  561. </li><br>
  562. <li>sslVersion<br>
  563. Siehe das global Attribut sslVersion.
  564. </li><br>
  565. </ul>
  566. </ul>
  567. =end html_DE
  568. =cut
  569. 1;