package SrvMngr::Controller::Ddclient; #---------------------------------------------------------------------- # heading : Network # description : Dynamic Clients # navigation : 6000 450 # # name : ddclient, method : get, url : /ddclient, ctlact : Ddclient#main # name : ddclient3, method : post, url : /ddclient3, ctlact : Ddclient#do_updateparams # name : ddclient1, method : get, url : /ddclient1, ctlact : Ddclient#do_summary_domain # name : ddclient2, method : get, url : /ddclient2, ctlact : Ddclient#do_summary_custom # name : ddclient4, method : post, url : /ddclient4, ctlact : Ddclient#do_delete_domain # name : ddclient5, method : get, url : /ddclient5, ctlact : Ddclient#do_update_domain # name : ddclient6, method : get, url : /ddclient6, ctlact : Ddclient#do_create_custom # name : ddclient7, method : post, url : /ddclient7, ctlact : Ddclient#do_create_custom_actual # name : ddclient8, method : post, url : /ddclient8, ctlact : Ddclient#do_update_domain # # routes : end # # Documentation: https://wiki.contribs.org/Ddclient # #---------------------------------------------------------------------- # # ddclient 3.9.1 Supportted services # #DynDNS.com - See http://www.dyndns.com for details on obtaining a free account. #Hammernode - See http://www.hn.org for details on obtaining a free account. #Zoneedit - See http://www.zoneedit.com for details. #EasyDNS - See http://www.easydns.com for details. #NameCheap - See http://www.namecheap.com for details #DslReports - See http://www.dslreports.com for details #Sitelutions - See http://www.sitelutions.com for details #Loopia - See http://www.loopia.se for details #Noip - See http://www.noip.com/ for details #Freedns - See http://freedns.afraid.org/ for details #ChangeIP - See http://www.changeip.com/ for details #dtdns - See http://www.dtdns.com/ for details #nsupdate - See nsupdate(1) and ddns-confgen(8) for details #CloudFlare - See https://www.cloudflare.com/ for details #Google - See http://www.google.com/domains for details #Duckdns - See https://duckdns.org/ for details #Freemyip - See https://freemyip.com for details #woima.fi - See https://woima.fi/ for details #Yandex - See https://domain.yandex.com/ for details #DNS Made Easy - See https://dnsmadeeasy.com/ for details #DonDominio - See https://www.dondominio.com for details #NearlyFreeSpeech.net - See https://www.nearlyfreespeech.net/services/dns for details #OVH - See https://www.ovh.com for details #ClouDNS - See https://www.cloudns.net # ddclient 3.11.1 Supported Services # 1984:https://kb.1984hosting.com/doku.php?id=freedns # changeip: https://changeip.com # cloudflare: https://cloudflare.com # cloudns: https://cloudns.com # digitalocean: https://digitalocean.com # dinahosting: https://dinahosting.com # dnsexit: https://dnsexit.com/ # dnsmadeeasy: https://dnsmadeeasy.com # domeneshop: https://domeneshop.com # dondominio: https://dondominio.com # dslreports: https://www.dslreports.com/ # duckdns: https://duckdns.com # dyndns1:https://account.dyn.com/ # dyndns2: https://account.dyn.com/ # easydns: https://easydns.com # enom: https://enom.com # freedns: http://freedns.com # freemyip: https://freemyip.com # gandi: https://gandi.com # godaddy: https://godaddy.com # googledomains: https://googledomains.com # hetzner: https://hetzner.com # infomaniak: https://infomaniak.com # keysystems: https://keysystems.com # mythicdyn: https://www.mythic-beasts.com/support/api/dnsv2/dynamic-dns # namecheap: https://namecheap.com # nfsn: http://nfsn.com # njalla: https://njalla.com # noip: https://noip.com # nsupdate: http://nsupdate.com # ovh: https://ovh.com # porkbun: https://porkbun.com # regfishde: Cannot find link for this one # sitelutions: https://sitelutions.com # woima: http://woima.com # yandex: https://yandex.com # zoneedit: https://www.zoneedit.com/dynamic-dns/ use strict; use warnings; use Mojo::Base 'Mojolicious::Controller'; use constant FALSE => 0; use constant TRUE => 1; use Locale::gettext; use SrvMngr::I18N; use SrvMngr qw(theme_list init_session); use Data::Dumper; use esmith::util; use esmith::HostsDB; use esmith::AccountsDB; our $db = esmith::ConfigDB->open(); our $adb = esmith::AccountsDB->open(); our $domaindb = esmith::ConfigDB->open('/home/e-smith/db/domains') or die "Unable to open domains db"; our $edb; $edb = esmith::ConfigDB->open('/home/e-smith/db/ddclient') or $edb = esmith::ConfigDB->create('/home/e-smith/db/ddclient'); my %ddc_datas = (); sub get_devices_names { # # Router/Firewall devices from which it can get ip address # my $devices = ( [ [ '2Wire 1701HG Gateway' => '2wire' ], [ '3com 3c886a 56k Lan Modem' => '3com-3c886a' ], [ '3com OfficeConnect Remote 812' => '3com-oc-remote812' ], [ 'Alcatel Speed Touch 510' => 'alcatel-510' ], [ 'Alcatel/Thomson SpeedTouch 530' => 'alcatel-530' ], [ 'Alcatel Speed Touch Pro' => 'alcatel-stp' ], [ 'Allnet 1298' => 'allnet-1298' ], [ 'Cayman 3220-H DSL' => 'cayman-3220h' ], [ 'D-Link DI-524' => 'dlink-524' ], [ 'D-Link DI-604' => 'dlink-604' ], [ 'dlink-614' => 'D-Link DI-614+' ], [ 'e-tech' => 'E-tech Router' ], [ 'elsa-lancom-dsl10' => 'ELSA LanCom DSL/10 DSL FW' ], [ 'elsa-lancom-dsl10-ch01' => 'ELSA LanCom DSL/10 DSL FW (isdn ch01)' ], [ 'elsa-lancom-dsl10-ch02' => 'ELSA LanCom DSL/10 DSL FW (isdn ch01)' ], [ 'linksys' => 'Linksys FW' ], [ 'linksys-rv042-wan1' => 'Linksys RV042 Dual Homed Router WAN Port 2' ], [ 'linksys-rv042-wan2' => 'Linksys RV042 Dual Homed Router WAN Port 2' ], [ 'linksys-ver2' => 'Linksys FW version 2' ], [ 'linksys-ver3' => 'Linksys FW version 3' ], [ 'linksys-wcg200' => 'Linksys WCG200 FW' ], [ 'linksys-wrt854g' => 'Linksys WRT854G FW' ], [ 'maxgate-ugate3x00' => 'MaxGate UGATE-3x00 FW' ], [ 'netcomm-nb3' => 'NetComm NB3' ], [ 'netgear-dg834g' => 'netgear-dg834g' ], [ 'netgear-rp614' => 'Netgear RP614 FW' ], [ 'netgear-rt3xx' => 'Netgear FW' ], [ 'netgear-wgt624' => 'Netgear WGT624' ], [ 'netgear-wpn824' => 'Netgear WPN824 FW' ], [ 'netopia-r910' => 'Netopia R910 FW' ], [ 'olitec-SX200' => 'olitec-SX200' ], [ 'rtp300' => 'Linksys RTP300' ], [ 'siemens-ss4200' => 'Siemens SpeedStream 4200' ], [ 'sitecom-dc202' => 'Sitecom DC-202 FW' ], [ 'smc-barricade' => 'SMC Barricade FW' ], [ 'smc-barricade-7004vbr' => 'SMC Barricade FW (7004VBR model config)' ], [ 'smc-barricade-7401bra' => 'SMC Barricade 7401BRA FW' ], [ 'smc-barricade-alt' => 'SMC Barricade FW (alternate config)' ], [ 'sohoware-nbg800' => 'SOHOWare BroadGuard NBG800' ], [ 'sveasoft' => 'Sveasoft WRT54G/WRT54GS' ], [ 'thomson-st536v6' => 'Thomson SpeedTouch 536v6' ], [ 'thomson-tg782' => 'Thomson/Technicolor TG782' ], [ 'vigor-2200usb' => 'Vigor 2200 USB' ], [ 'watchguard-edge-x' => 'Watchguard Edge X FW' ], [ 'watchguard-soho' => 'Watchguard SOHO FW' ], [ 'westell-6100' => 'Westell C90-610015-06 DSL Router' ], [ 'xsense-aero' => 'Xsense Aero' ] ] ); return $devices; # Automatic loading of the devices from the ddclient program - I can't get this to pass the results successfully to the template #my $output = `ddclient -list-devices`; # Run ddclient command to get devices output #my @lines; #foreach my $line (split /\n/, $output) { #$line =~ s/\s+//; # Remove leading whitespace #my ($field1, $field2) = split(' ', $line, 2); #push @lines, [$field2, $field1]; #} #return \@lines; # Return a reference to the lines array } sub get_web_services_names { # # Web Services from which it can get ip address # my $webservices = ( [ [ 'dyndns-http://checkip.dyndns.org/' => 'dyndns' ], [ 'freedns-https://freedns.afraid.org/dynamic/check.php' => 'freedns' ], [ 'googledomains-https://domains.google.com/checkip' => 'googledomains' ], [ 'he-https://checkip.dns.he.net/' => 'he' ], [ 'ip4only.me-https://ip4only.me/api/' => 'ip4only.me' ], [ 'ip6only.me-https://ip6only.me/api/' => 'ip6only.me' ], [ 'ipify-ipv4-https://api.ipify.org/' => 'ipify-ipv4' ], [ 'ipify-ipv6-https://api6.ipify.org/' => 'ipify-ipv6' ], [ 'loopia:-https://dns.loopia.se/checkip/checkip.php' => 'loopia' ], [ 'myonlineportal-https://myonlineportal.net/checkip' => 'myonlineportal' ], [ 'noip-ipv4-http://ip1.dynupdate.no-ip.com/' => 'noip-ipv4' ], [ 'noip-ipv6-http://ip1.dynupdate6.no-ip.com/' => 'noip-ipv6' ], [ 'nsupdate.info-ipv4-https://ipv4.nsupdate.info/myip' => 'nsupdate.info-ipv4' ], [ 'nsupdate.info-ipv6-https://ipv6.nsupdate.info/myip' => 'nsupdate.info-ipv6' ], [ 'zoneedit-https://dynamic.zoneedit.com/checkip.html' => 'zoneedit' ] ] ); return $webservices #my $output = `ddclient -list-web-services`; # Run ddclient command to get web services output #my @lines; #foreach my $line (split /\n/, $output) { #$line =~ s/\s+//; # Remove leading whitespace #my ($field1, $field2) = split(' ', $line, 2); #push @lines, [$field2, $field1]; #} #return \@lines; # Return a reference to the lines array } sub get_dns_labels { # # dns service names # Return array with translated results as well. # # Note that "new" ones willl not have any description / translation, this can be added to /usr/share/smanager/lib/SrvMngr/I18N/Modules/Ddclient # my $c = shift; my $dnsservices = ( [ [ $c->l('1984') => '1984' ], [ $c->l('changeip') => 'changeip' ], [ $c->l('cloudflare') => 'cloudflare' ], [ $c->l('cloudns') => 'cloudns' ], [ $c->l('digitalocean') => 'digitalocean' ], [ $c->l('dinahosting') => 'dinahosting' ], [ $c->l('dnsexit') => 'dnsexit' ], [ $c->l('dnsmadeeasy') => 'dnsmadeeasy' ], [ $c->l('domeneshop') => 'domeneshop' ], [ $c->l('dondominio') => 'dondominio' ], [ $c->l('dslreports') => 'dslreports' ], [ $c->l('duckdns') => 'duckdns' ], [ $c->l('dyndns1') => 'dyndns1' ], [ $c->l('dyndns2') => 'dyndns2' ], [ $c->l('easydns') => 'easydns' ], [ $c->l('enom') => 'enom' ], [ $c->l('freedns') => 'freedns' ], [ $c->l('freemyip') => 'freemyip' ], [ $c->l('gandi') => 'gandi' ], [ $c->l('godaddy') => 'godaddy' ], [ $c->l('googledomains') => 'googledomains' ], [ $c->l('hetzner') => 'hetzner' ], [ $c->l('infomaniak') => 'infomaniak' ], [ $c->l('keysystems') => 'keysystems' ], [ $c->l('mythicdyn') => 'mythicdyn' ], [ $c->l('namecheap') => 'namecheap' ], [ $c->l('nfsn') => 'nfsn' ], [ $c->l('njalla') => 'njalla' ], [ $c->l('noip') => 'noip' ], [ $c->l('nsupdate') => 'nsupdate' ], [ $c->l('ovh') => 'ovh' ], [ $c->l('porkbun') => 'porkbun' ], [ $c->l('regfishde') => 'regfishde' ], [ $c->l('sitelutions') => 'sitelutions' ], [ $c->l('woima') => 'woima' ], [ $c->l('yandex') => 'yandex' ], [ $c->l('zoneedit') => 'zoneedit' ] ] ); return $dnsservices; #my $output = `ddclient -list-protocols`; # Run ddclient command and capture the output #my @protocols; #foreach my $line (split /\n/, $output) { #my ($protocol) = $line =~ /\s*(\S+)/; #next unless $protocol; # Skip if protocol is empty or contains only whitespace #my $custom_value = "$protocol.$c->l($protocol)"; # Additional column value using $c->l(protocol) #push @protocols, [$custom_value, $protocol]; #} #return \@protocols; # Return a reference to the protocols array } sub main { # # Initial page - full summary of parameters etc # Initial para from the Wiki. # my $c = shift; $ddc_datas{"first"} = 'DESCRIPTION'; do_display( $c, %ddc_datas ); } sub do_display { # # Front Summary page # my $c = shift; $c->app->log->info( $c->log_req ); my $title = $c->l('FORM_TITLE'); my $modul = ''; $ddc_datas{trt} = 'LIST'; my $trt = "LIST"; $ddc_datas{"params"} = get_params($c); my @domains = get_domain_table($c); my @FreeDomains = get_custom_table($c); my $emptydom = ( scalar @domains == 0 ); my $emptycust = ( scalar @FreeDomains == 0 ); my $Labels = ( [ [ $c->l('SME external Interface') => "smeIF" ], [ $c->l('SME configuration DB') => 'smeCMD' ], [ $c->l('web') => 'web' ], [ $c->l('Router/Firewall') => 'router' ], [ $c->l('Interface') => 'if' ], [ $c->l('IP') => 'ip' ], [ $c->l('Command') => 'cmdv4' ] ] ); $c->stash( title => $title, modul => $modul, ddc_datas => \%ddc_datas, domains => \@domains, freedomains => \@FreeDomains, methodlabels => $Labels, dnslabels => get_dns_labels($c), devices => get_devices_names($c), webservices => get_web_services_names($c), emptydom => $emptydom, emptycust => $emptycust ); $ddc_datas{'trt'} = $trt; $c->stash( title => $title, modul => $modul, ddc_datas => \%ddc_datas ); $c->render( template => 'ddclient' ); } sub do_updateparams { # # Called to update the parameters relating to the Ip address of the server # my $c = shift; $ddc_datas{"first"} = ''; $ddc_datas{"success"} = pushParams($c); do_display($c); } sub do_update_domain { # #Called to update/delete the ddclient for a specific inbuilt domain # my $c = shift; my $title = $c->l("MODIFY_TITLE"); my $retmsg; if ( $c->param("Route") eq "ddclient2" ) { #Route is hidden field $retmsg = performModifyCustom($c); } else { $retmsg = performModifyDomain($c); } $ddc_datas{"first"} = ''; if ( $retmsg eq "ok" ) { my $dns = $c->param('dns'); my $domain = $c->param('domainname'); $ddc_datas{"success"} = $c->l( "SUCCESSFULLY_MODIFIED", $domain, $c->l( '' . $dns ) ); do_display( $c, %ddc_datas ); } else { $ddc_datas{"error"} = $retmsg; #Back to input panel to correct error do_summary_domain($c); } } sub do_create_custom { # # Create custom domain # my $c = shift; my $title = $c->l("CREATE_TITLE"); my $modul = ''; my $trt = "NEW"; $ddc_datas{trt} = $trt; $c->stash( title => $title, modul => $modul, ddc_datas => \%ddc_datas, dnslabels => get_dns_labels($c), devices => get_devices_names($c), webservices => get_web_services_names($c) ); $c->render( template => 'ddclient' ); } sub do_create_custom_actual { my $c = shift; $ddc_datas{"first"} = ''; my $retmsg = performCreateCustom($c); if ( $retmsg eq "ok" ) { my $dns = $c->param('dns'); my $domain = $c->param('domainname'); $ddc_datas{"success"} = $c->l( "SUCCESSFULLY_DELETED", $domain, $c->l( '' . $dns ) ); do_display( $c, %ddc_datas ); } else { $ddc_datas{"error"} = $retmsg; #Back to input panel to correct error do_create_custom($c); } } sub do_summary_custom { # # Display delete or modify panel for custom domain # my $c = shift; my $title = $c->l("MODIFY_TITLE"); my $modul = ''; my $trt = $c->param("trt"); #Extract domain stuff from DB my @results = get_custom_table( $c, $c->param("Domain") ); #Returns just one row $ddc_datas{"Domain_details"} = $results[0]; $ddc_datas{'trt'} = $trt; $c->stash( title => $title, modul => $modul, ddc_datas => \%ddc_datas, dnslabels => get_dns_labels($c), devices => get_devices_names($c), webservices => get_web_services_names($c) ); $c->render( template => 'ddclient' ); } sub do_summary_domain { # # Display delete or modify panel for inbuilt domain # param trt = MOD or DEL # my $c = shift; my $title = $c->l("MODIFY_TITLE"); my $modul = ''; my $trt = $c->param("trt"); #Extract domain stuff from DB my @results = get_domain_table( $c, $c->param("Domain") ); #Returns just one row $ddc_datas{"Domain_details"} = $results[0]; $ddc_datas{'trt'} = $trt; $c->stash( title => $title, modul => $modul, ddc_datas => \%ddc_datas, dnslabels => get_dns_labels($c), devices => get_devices_names($c), webservices => get_web_services_names($c) ); $c->render( template => 'ddclient' ); } sub do_delete_domain { # # Actually clearout the inbuilt domain # Return to initial page with message at the top. # my $c = shift; my $route = $c->current_route; my $title = $c->l("REMOVE_TITLE"); my $modul = ''; my $retmsg = ""; my $domain = $c->param("Domain"); $ddc_datas{"first"} = ''; #Delete it and return to front summary panel - depends on route domain or custom if ( $c->param("Route") eq "ddclient2" ) { #Route is hidden field $retmsg = performDeleteCustom( $c, $domain ); } else { $retmsg = performDeleteDomain( $c, $domain ); } if ( $retmsg eq "ok" ) { $ddc_datas{"success"} = $c->l( "SUCCESSFULLY_DELETED", $domain, $c->l( '' . $c->param("dns") ) ); } else { $ddc_datas{"error"} = $retmsg; } do_display( $c, %ddc_datas ); } sub do_delete_custom { # # Actually delete the custom domain # Return to initial page with message at the top. # my $c = shift; my $route = $c->current_route; my $title = $c->l("REMOVE_TITLE"); my $modul = ''; my $retmsg = ""; my $domain = $c->param("Domain"); $ddc_datas{"first"} = ''; #Delete it and return to front summary panel - depends on route domain or custom $retmsg = performDeleteCustom( $c, $domain ); if ( $retmsg eq "ok" ) { $ddc_datas{"success"} = $c->l( "SUCCESSFULLY_DELETED", $domain ); } else { $ddc_datas{"error"} = $retmsg; } do_display( $c, %ddc_datas ); } sub get_domain_table { # # Return full table of all domains OR just the details for the specified one # my ( $c, $findDomain ) = @_; #$c and domain to find $findDomain = FALSE if ( scalar(@_) <= 1 ); my $key; my @virtualDomains = (); foreach my $domain ( $domaindb->get_all_by_prop( type => 'domain' ) ) { $key = $domain->key; push( @virtualDomains, $key ); } my $numDomains = @virtualDomains; if ( $numDomains == 0 ) { return () } else { my $domain; my @virtualDomains2d = (); foreach $domain ( sort @virtualDomains ) { my %properties = $domaindb->get($domain)->props; my $test = $domaindb->get($domain) || ''; my %extraprops; if ( $test ne '' ) { %extraprops = $domaindb->get($domain)->props; } my $content; if ( $properties{'Content'} eq 'wwwpublic' ) { $content = $c->l('PRIMARY_SITE'); } else { $content = $c->l( 'CONTENT', $properties{'Content'} ); } my $public; my %thisrow; if ( $test eq '' ) { %thisrow = ( "Domain" => $domain, "Description" => $properties{'Description'}, "Content" => $content, "dns" => "", "Publication" => "", "customprotocol" => "", "customdns" => "", "login" => "", "password" => "", "mx" => "" ); push( @virtualDomains2d, \%thisrow ); } else { %thisrow = ( "Domain" => $domain, "Description" => $properties{'Description'}, "Content" => $content, "dns" => $extraprops{'dns'}, "Publication" => $c->l( '' . $extraprops{'dns'} ), "customprotocol" => $properties{"customprotocol"}, "customdns" => $properties{"customdns"}, "login" => $properties{"login"}, "password" => $properties{"password"}, "mx" => $properties{"mx"}, ); push( @virtualDomains2d, \%thisrow ); } if ($findDomain) { if ( $domain eq $findDomain ) { @virtualDomains2d = (); #Just return matching one push( @virtualDomains2d, \%thisrow ); last; } } #Found the one needed } return @virtualDomains2d; #Return the lot } } sub get_custom_table { # # Return full table of all domains OR just the details for the specified one # my ( $c, $findDomain ) = @_; #$c and domain to find $findDomain = FALSE if ( scalar(@_) <= 1 ); my $key; my @FreeDomains = (); foreach my $domain ( $edb->get_all_by_prop( type => 'ddhost' ) ) { $key = $domain->key; push( @FreeDomains, $key ); } my $numDomains = @FreeDomains; my @freedomains2d = (); if ( $numDomains > 0 ) { foreach my $domain ( sort @FreeDomains ) { my $vals = $edb->get($domain); my $content = $vals->prop('desc'); my $publish = $vals->prop('dns'); my %thisrow = ( 'Domain' => $domain, "Description" => $content, "dns" => $publish, "Publication" => $c->l( '' . $publish ) , #msg ddc prefix for ddclient "customprotocol" => $vals->prop("customprotocol"), "customdns" => $vals->prop("customdns"), "login" => $vals->prop("login"), "password" => $vals->prop("password"), "mx" => $vals->prop("mx"), ); push( @freedomains2d, \%thisrow ); if ($findDomain) { if ( $domain eq $findDomain ) { @freedomains2d = (); #Just return matching one push( @freedomains2d, \%thisrow ); last; } } #Found the one needed } } return @freedomains2d; } sub get_params { my $c = shift; my $ddretrieve = $db->get('ddclient'); my $ExtIF = $db->get('ExternalInterface'); my $DeamonUpdate = $ddretrieve->prop('DeamonUpdate') || '300'; my $urlcheckip = $ddretrieve->prop('urlcheckip') || 'checkip.dyndns.org'; my $ssl = $ddretrieve->prop('SSL') || 'yes'; my $method = $ddretrieve->prop('method') || 'web'; my $Extinterface = $ddretrieve->prop('Extinterface') || ''; my $cmd = $ddretrieve->prop('cmd') || ''; my $forceIP = $ddretrieve->prop('ForceIP') || ''; my $fwlogin = $ddretrieve->prop('fwlogin') || ''; my $fwpassword = $ddretrieve->prop('fwpassword') || ''; my $res = { "ssl" => $ssl, "DeamonUpdate" => $DeamonUpdate, "method" => $method, "Extinterface" => $Extinterface, "cmd" => $cmd, "ForceIP" => $forceIP, "urlcheckip" => $urlcheckip, "FWlogin" => $fwlogin, "FWpassword" => $fwpassword }; return $res; } sub pushParams { my $c = shift; my $retrievedeamonupdate = $c->param('retrievedeamonupdate'); my $retrieverouter = $c->param('retrieverouter'); my $retrievewebservice = $c->param('retrievewebservice'); my $retrieveurlcheckip = $c->param('retrieveurlcheckip'); my $retrievessl = $c->param('retrievessl'); my $retrievemethod = $c->param('retrievemethod'); my $retrieveinterface = $c->param('retrieveinterface'); my $retrievecmd = $c->param('retrievecmd'); my $retrieveip = $c->param('retrieveip'); my $retrievefwlogin = $c->param('retrieverouterlogin'); my $retrievefwpassword = $c->param('retrieverouterpassword'); #print 1 / 0; #Crash my $ddclient = $db->get('ddclient'); $ddclient->set_prop( 'urlcheckip' => $retrievewebservice || $retrieveurlcheckip ); $ddclient->set_prop( 'DeamonUpdate' => $retrievedeamonupdate ); $ddclient->set_prop( 'SSL' => $retrievessl ); $ddclient->set_prop( 'method' => $retrievemethod ); if ($retrievemethod eq 'router') { $ddclient->set_prop( 'Extinterface' => $retrieverouter ); } else { $ddclient->set_prop( 'Extinterface' => $retrieveinterface ); } $ddclient->set_prop( 'cmd' => $retrievecmd ); $ddclient->set_prop( 'ForceIP' => $retrieveip ); $ddclient->set_prop( 'fwlogin' => $retrievefwlogin ); $ddclient->set_prop( 'fwpassword' => $retrievefwpassword ); $domaindb->reload(); system( "/sbin/e-smith/signal-event", "smeserver-ddclient-update" ); return $c->l('SUCCESSFULLY_MODIFIED_RETRIEVE_IP'); } # We seem to be missing a Create Domain here # sub performCreateDomain sub performModifyDomain { my $c = shift; #------------------------------------------------------------ # Validate parameters and untaint them #------------------------------------------------------------ my $domainName = $c->param('domainName'); if ( $domainName =~ /([a-zA-Z0-9\-\.]+)$/ ) { $domainName = $1; } else { return $c->l( 'DOMAIN_NAME_VALIDATION_ERROR', $domainName ); } my $domainLogin = $c->param('login'); if ( $domainLogin =~ /([\-\'\w][\-\'\w\s\.\@]*)$/ ) { $domainLogin = $1; } else { return $c->l( 'DOMAIN_LOGIN_VALIDATION_ERROR', $domainLogin ); } my $domainPassword = $c->param('password'); if ( $domainPassword =~ /(.*)$/ ) { $domainPassword = $1; } else { return $c->l( 'DOMAIN_PASSWORD_VALIDATION_ERROR', $domainPassword ); } my $domainMX = $c->param('mx'); my $customDNS = $c->param('customdns'); my $customPROTOCOL = $c->param('customprotocol'); my $dns = $c->param('dns'); if ( $dns eq 'CUSTOMDNS' ) { if ( $customDNS =~ /([a-zA-Z0-9\-\.]+)$/ ) { $customDNS = $1; } else { return $c->l( 'CUSTOMDNS_VALIDATION_ERROR', $domainName ); } } #------------------------------------------------------------ # Looks good. Find out if this domain has been taken # or if the domain is a reserved to provide a secured webserver # for a previous domain #------------------------------------------------------------ # my $dns = $c->param ('dns'); my $dom = $domaindb->get($domainName); $dom->set_prop( 'dns' => $dns ); $dom->set_prop( 'login' => $domainLogin ); $dom->set_prop( 'password' => $domainPassword ); $dom->set_prop( 'mx' => $domainMX ); $dom->set_prop( 'customdns' => $customDNS ); $dom->set_prop( 'customprotocol' => $customPROTOCOL ); $domaindb->reload(); system( "/sbin/e-smith/signal-event", "ddclient" ); return "ok"; } sub performDeleteDomain { my ( $c, $domain ) = @_; #------------------------------------------------------------ # Attempt to delete domain #------------------------------------------------------------ if ( $domain =~ /([a-zA-Z0-9\-\.]+)$/ ) { $domain = $1; } else { return $c->l( 'ERROR_WHILE_REMOVING_DOMAIN', $domain ); } my $value = $domaindb->get($domain); unless ($value) { return $c->l( 'NONEXISTENT_DOMAIN_ERROR', $domain ); } my %properties = $value->props; my $type = $properties{'type'}; if ( $type ne 'domain' ) { return $c->l( 'NONEXISTENT_DOMAIN_ERROR', $domain ); } my $evalue = $domaindb->get($domain); $evalue->set_prop( 'dns' => '' ); $evalue->set_prop( 'login' => '' ); $evalue->set_prop( 'password' => '' ); $evalue->set_prop( 'customdns' => '' ); $evalue->set_prop( 'customprotocol' => '' ); $domaindb->reload(); system( "/sbin/e-smith/signal-event", "domain-modify" ); return "ok"; } sub performCreateCustom { my ($c) = shift; #------------------------------------------------------------ # Validate parameters and untaint them #------------------------------------------------------------ my $domainName = $c->param('domainName'); if ( $domainName =~ /([a-zA-Z0-9\-\.]+)$/ ) { $domainName = $1; } else { return $c->l( 'DOMAIN_NAME_VALIDATION_ERROR', $domainName ); } foreach my $domain ( $edb->get_all_by_prop( type => 'domain' ) ) { my $key = $domain->key; if ( $key eq $domainName ) { return $c->l( 'DOMAIN_NAME_ALREADY_EXIST', $domainName ); } } foreach my $domain ( $domaindb->get_all_by_prop( type => 'ddhost' ) ) { my $key = $domain->key; if ( $key eq $domainName ) { return $c->l( 'DOMAIN_NAME_ALREADY_EXIST', $domainName ); } } my $domainDesc = $c->param('desc'); my $domainLogin = $c->param('login'); if ( $domainLogin =~ /([\-\'\w][\-\'\w\s\.\@]*)$/ ) { $domainLogin = $1; } else { return $c->l( 'DOMAIN_LOGIN_VALIDATION_ERROR', $domainLogin ); } my $domainPassword = $c->param('password'); if ( $domainPassword =~ /(.*)$/ ) { $domainPassword = $1; } else { return $c->l( 'DOMAIN_PASSWORD_VALIDATION_ERROR', $domainPassword ); } my $domainMX = $c->param('mx'); my $customDNS = $c->param('customdns'); my $customPROTOCOL = $c->param('customprotocol'); my $dns = $c->param('dns'); if ( $dns eq 'CUSTOMDNS' ) { if ( $customDNS =~ /([a-zA-Z0-9\-\.]+)$/ ) { $customDNS = $1; } else { return $c->l( 'CUSTOMDNS_VALIDATION_ERROR', $domainName ); } } #------------------------------------------------------------ # Looks good. Find out if this domain has been taken # or if the domain is a reserved to provide a secured webserver # for a previous domain #------------------------------------------------------------ my %properties = (); $properties{'type'} = 'ddhost'; $properties{'dns'} = $dns; $properties{'login'} = $domainLogin; $properties{'password'} = $domainPassword; $properties{'mx'} = $domainMX; $properties{'desc'} = $domainDesc; $properties{'customdns'} = $customDNS; $properties{'customprotocol'} = $customPROTOCOL; $edb->new_record( $domainName, \%properties ); system( "/sbin/e-smith/signal-event", "domain-create" ); return "ok"; } sub performModifyCustom { my $c = shift; #------------------------------------------------------------ # Validate parameters and untaint them #------------------------------------------------------------ my $domainName = $c->param('domainName'); if ( $domainName =~ /([a-zA-Z0-9\-\.]+)$/ ) { $domainName = $1; } else { return $c->l( 'DOMAIN_NAME_VALIDATION_ERROR', $domainName ); } my $domainLogin = $c->param('login'); if ( $domainLogin =~ /([\-\'\w][\-\'\w\s\.\@]*)$/ ) { $domainLogin = $1; } else { return $c->l( 'DOMAIN_LOGIN_VALIDATION_ERROR', $domainLogin ); } my $domainPassword = $c->param('password'); if ( $domainPassword =~ /(.*)$/ ) { $domainPassword = $1; } else { return $c->l( 'DOMAIN_PASSWORD_VALIDATION_ERROR', $domainPassword ); } my $domainMX = $c->param('mx'); my $customDNS = $c->param('customdns'); my $customPROTOCOL = $c->param('customprotocol'); my $dns = $c->param('dns'); if ( $dns eq 'CUSTOMDNS' ) { if ( $customDNS =~ /([a-zA-Z0-9\-\.]+)$/ ) { $customDNS = $1; } else { return $c->l( 'CUSTOMDNS_VALIDATION_ERROR', $domainName ); } } #------------------------------------------------------------ # Looks good. Find out if this domain has been taken # or if the domain is a reserved to provide a secured webserver # for a previous domain #------------------------------------------------------------ # my $dns = $c->param ('dns'); my $dom = $edb->get($domainName); $dom->set_prop( 'dns' => $dns ); $dom->set_prop( 'login' => $domainLogin ); $dom->set_prop( 'password' => $domainPassword ); $dom->set_prop( 'mx' => $domainMX ); $dom->set_prop( 'customdns' => $customDNS ); $dom->set_prop( 'customprotocol' => $customPROTOCOL ); $domaindb->reload(); system( "/sbin/e-smith/signal-event", "domain-modify" ); return "ok"; } sub performDeleteCustom { my ( $c, $domain ) = @_; #------------------------------------------------------------ # Attempt to delete domain #------------------------------------------------------------ if ( $domain =~ /([a-zA-Z0-9\-\.]+)$/ ) { $domain = $1; } else { return $c->l( 'ERROR_WHILE_REMOVING_DOMAIN', $domain ); } my $evalue = $edb->get($domain); unless ($evalue) { return $c->l( 'NONEXISTENT_DOMAIN_ERROR', $domain ); } my %properties = $evalue->props; my $type = $properties{'type'}; if ( $type ne 'ddhost' ) { return $c->l( 'NONEXISTENT_DOMAIN_ERROR', $domain ); } $evalue->delete; $edb->reload(); system( "/sbin/e-smith/signal-event", "domain-delete" ); return "ok"; } 1;