aboutsummaryrefslogtreecommitdiffstats
path: root/config/archive/freenas/pkg/freenas_services.inc
diff options
context:
space:
mode:
Diffstat (limited to 'config/archive/freenas/pkg/freenas_services.inc')
-rw-r--r--config/archive/freenas/pkg/freenas_services.inc2025
1 files changed, 2025 insertions, 0 deletions
diff --git a/config/archive/freenas/pkg/freenas_services.inc b/config/archive/freenas/pkg/freenas_services.inc
new file mode 100644
index 00000000..71401211
--- /dev/null
+++ b/config/archive/freenas/pkg/freenas_services.inc
@@ -0,0 +1,2025 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ freenas_services.inc
+ part of pfSense (http://www.pfSense.com)
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+
+ Based on FreeNAS (http://www.freenas.org)
+ Copyright (C) 2005-2006 Olivier Cochard-Labbé <olivier@freenas.org>.
+ All rights reserved.
+
+ Based on m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+define ("FTP_BACKEND_PAM", "pam");
+define ("FTP_BACKEND_PLAINTEXT", "plaintext");
+define ("NFS_SERVICE_PORTS", "111 2049 4711");
+
+$freenas_config =& $config['installedpackages']['freenas']['config'][0];
+
+/* Stop samba, Generate the samba configuration
+ * file and start samba Return 0 if OK, 1 or
+ * error code if error
+ */
+function services_samba_configure() {
+ global $freenas_config, $g;
+
+ /* kill any running samba */
+ killbyname("smbd");
+ killbyname("winbindd");
+ killbyname("nmbd");
+
+ if (isset($freenas_config['samba']['enable'])) {
+ if ($g['booting']) { echo "Starting Samba... "; }
+
+ /* make sure any of the required dirs exist */
+ if (! file_exists("{$g['varetc_path']}/private")) {
+ mkdir("{$g['varetc_path']}/private");
+ }
+ if (! file_exists("{$g['varlog_path']}/samba")) {
+ mkdir("{$g['varlog_path']}/samba");
+ }
+
+ /* generate smb.conf */
+ $fd = fopen("{$g['varetc_path']}/smb.conf", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open smb.conf in services_samba_configure().\n");
+ return 1;
+ }
+
+ /* If no share configured, exit */
+ if (!is_array($freenas_config['mounts']['mount'])) { return 0; }
+
+ $gen_date = date("F j, Y, g:i a");
+ $sambaconf = <<<EOD
+#
+# smb.conf generated by pfSense
+# Generated at: {$gen_date}
+#
+[global]
+encrypt passwords = yes
+netbios name = {$freenas_config['samba']['netbiosname']}
+workgroup = {$freenas_config['samba']['workgroup']}
+server string = {$freenas_config['samba']['serverdesc']}
+load printers = no
+security = {$freenas_config['samba']['security']}
+dns proxy = no
+socket options = IPTOS_LOWDELAY TCP_NODELAY
+EOD;
+
+ if ($freenas_config['samba']['sndbuf']) {
+ /* below is a continuation of socket options! */
+ $sambaconf .= <<<EOD
+ SO_SNDBUF={$freenas_config['samba']['sndbuf']}
+EOD;
+ } else {
+ /* below is a continuation of socket options! */
+ $sambaconf .= <<<EOD
+ SO_SNDBUF=16384
+EOD;
+ } // end if
+
+ if ($freenas_config['samba']['rcvbuf']) {
+ /* below is a continuation of socket options! */
+ $sambaconf .= <<<EOD
+ SO_RCVBUF={$freenas_config['samba']['rcvbuf']}
+EOD;
+ } else {
+ /* below is a continuation of socket options! */
+ $sambaconf .= <<<EOD
+ SO_RCVBUF=16384
+EOD;
+ } // end if
+
+ if ($freenas_config['samba']['winssrv']) {
+ $sambaconf .= <<<EOD
+
+wins server = {$freenas_config['samba']['winssrv']}
+
+EOD;
+ }
+
+ if (isset ($freenas_config['samba']['unixcharset'])) {
+ $sambaconf .= <<<EOD
+
+unix charset = {$freenas_config['samba']['unixcharset']}
+
+EOD;
+ } else {
+ $sambaconf .= <<<EOD
+
+unix charset = UTF-8
+
+EOD;
+
+ } // end if
+
+ $sambaconf .= <<<EOD
+
+local master = {$freenas_config['samba']['localmaster']}
+time server = {$freenas_config['samba']['timesrv']}
+guest account = ftp
+display charset = UTF-8
+max log size = 10
+syslog only = yes
+syslog = {$config['samba']['loglevel']}
+load printers = no
+printing = bsd
+printcap name = /dev/null
+disable spoolss = yes
+#Test: Try to improve samba performance under FreeBSD:
+use sendfile = yes
+strict locking = no
+#End of performance section
+log level = {$freenas_config['samba']['loglevel']}
+dos charset = {$freenas_config['samba']['doscharset']}
+smb passwd file = {$g['varetc_path']}/private/smbpasswd
+private dir = {$g['varetc_path']}/private
+
+EOD;
+
+ switch ($freenas_config['samba']['security']) {
+ case "share":
+ $sambaconf .= <<<EOD
+create mask = 0666
+directory mask = 0777
+passdb backend = smbpasswd
+
+EOD;
+
+ $guestmode = <<<EOD
+guest ok = yes
+
+EOD;
+
+ break; // end case "share"
+ case "domain":
+ $sambaconf .= <<<EOD
+passdb backend = smbpasswd
+allow trusted domains = No
+dns proxy = No
+ldap ssl = no
+idmap backend = rid:{$freenas_config['samba']['workgroup']}=10000-20000
+idmap uid = 10000-20000
+idmap gid = 10000-20000
+winbind enum groups = yes
+winbind enum users = yes
+winbind use default domain = Yes
+template homedir = /mnt
+template shell = /bin/sh
+
+EOD;
+
+ $guestmode = <<<EOD
+guest ok = no
+
+EOD;
+ break; // end case "domain":
+ case "user":
+ $sambaconf .= <<<EOD
+passdb backend = smbpasswd
+
+EOD;
+
+ $guestmode = <<<EOD
+guest ok = no
+
+EOD;
+
+ break; // end case "user":
+ } // end switch
+
+ foreach ($freenas_config['mounts']['mount'] as $mountent) {
+ /* Unmount filesystem if not booting mode*/
+ $sambaconf .= <<<EOD
+
+[{$mountent['sharename']}]
+comment = {$mountent['desc']}
+path = /mnt/{$mountent['sharename']}
+public = yes
+writeable = yes
+printable = no
+veto files = /Network Trash Folder/Icon?/:2e*/.AppleDesktop/.AppleDB/.AppleDouble/TheFindByContentFolder/TheVolumeSettingsFolder/Temporary Items/.snap/
+hide dot files = yes
+{$guestmode}
+
+EOD;
+
+ if ( (is_array($freenas_config['samba']['hidemount']) && in_array($mountent['sharename'],$freenas_config['samba']['hidemount']))) {
+ $sambaconf .= <<<EOD
+browseable = no
+
+EOD;
+
+ } // end if
+
+ if (isset($freenas_config['samba']['recyclebin'])) {
+ $sambaconf .= <<<EOD
+vfs object = recycle
+recycle:repository = Recycle Bin
+recycle:keeptree = Yes
+recycle:versions = Yes
+
+EOD;
+ } // end if
+ } // end foreach
+
+ fwrite($fd, $sambaconf);
+ fclose($fd);
+
+ /* run nmbd and nmbd */
+ if (isset($freenas_config['ad']['enable'])) {
+ mwexec("/usr/local/bin/net rpc join -S {$freenas_config['ad']['ad_srv_name']} -U {$freenas_config['ad']['admin_name']}%{$freenas_config['ad']['admin_pass']}");
+ }
+
+ $result |= mwexec("/usr/local/sbin/nmbd -D -s {$g['varetc_path']}/smb.conf");
+
+ if (isset($freenas_config['ad']['enable'])) {
+ mwexec("/usr/local/sbin/winbindd -s {$g['varetc_path']}/smb.conf");
+ //mwexec("/usr/local/sbin/wbinfo --set-auth-user {$freenas_config['ad']['admin_name']}%{$freenas_config['ad']['admin_pass']}");
+ }
+
+ $result |= mwexec("/usr/local/sbin/smbd -D -s {$g['varetc_path']}/smb.conf");
+
+ /* TEST: Wait for samba starting */
+ sleep(2);
+
+ /* Generate the samba password file */
+ $result |= system_user_samba();
+
+ if ($g['booting']) { echo "done\n"; }
+ }// end if
+
+ return $result;
+}
+
+/* Stop rsync, Generate the rsync configuration file and start
+ * rsync Return 0 if OK, 1 or error code if error
+ */
+function services_rsyncd_configure() {
+ global $freenas_config, $g;
+
+ /* kill any running rsync daemon */
+ sigkillbypid("{$g['varrun_path']}/rsyncd.pid", "TERM");
+
+ if (isset($freenas_config['rsyncd']['enable'])) {
+ if ($g['booting']) { echo "Starting RSYNC daemon... "; }
+
+ /* If no share configured, exit */
+ if (!is_array($freenas_config['mounts']['mount'])) { return 1; }
+
+ /* generate rsyncd.conf */
+ $fd = fopen("{$g['varetc_path']}/rsyncd.conf", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open rsyncd.conf in services_rsyncd_configure().\n");
+ return 1;
+ }
+
+ $rsyncdconf = <<<EOD
+read only = {$freenas_config['rsyncd']['readonly']}
+syslog facility = local4
+list = yes
+port = {$freenas_config['rsyncd']['port']}
+pid file = {$g['varrun_path']}/rsyncd.pid
+
+EOD;
+
+ if (!empty($freenas_config['rsyncd']['maxcon'])) {
+ $rsyncdconf .= <<<EOD
+max connections = {$freenas_config['rsyncd']['maxcon']}
+
+EOD;
+ }
+
+ if (!empty($freenas_config['rsyncd']['motd'])) {
+ $rsyncdconf .= <<<EOD
+motd file = {$g['varetc_path']}/rsyncd.motd
+
+EOD;
+ }
+
+ if (isset($freenas_config['rsyncd']['rsyncd_user'])) {
+ $rsyncdconf .= <<<EOD
+uid = {$freenas_config['rsyncd']['rsyncd_user']}
+
+EOD;
+
+ } else {
+ $rsyncdconf .= <<<EOD
+uid = ftp
+gid = ftp
+
+EOD;
+ } // end if
+
+ foreach ($freenas_config['mounts']['mount'] as $mountent) {
+ /* Unmount filesystem if not booting mode*/
+ $rsyncdconf .= <<<EOD
+
+[{$mountent['sharename']}]
+comment = {$mountent['desc']}
+path = /mnt/{$mountent['sharename']}
+
+EOD;
+ } // end foreach
+
+ fwrite($fd, $rsyncdconf);
+ fclose($fd);
+
+ // Generate MOTD file if configured
+ if (!empty($freenas_config['rsyncd']['motd'])) {
+ $fd = fopen("{$g['varetc_path']}/rsyncd.motd", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open rsyncd.motd in services_rsyncd_configure().\n");
+ return 1;
+ }
+
+ $motd = <<<EOD
+{$freenas_config['rsyncd']['motd']}
+
+EOD;
+
+ fwrite($fd, $motd);
+ fclose($fd);
+ } // end if
+
+ /* run rsync Daemon */
+ $result = mwexec("/usr/local/bin/rsync --daemon --config={$g['varetc_path']}/rsyncd.conf");
+
+ if ($g['booting']) { echo "done\n"; }
+ } // end if
+
+ return $result;
+}
+
+/* Stop nfs processes, Generate the nfs configuration file and
+ * start nfsd processes Return 0 if OK, 1 or error code if error
+ */
+function services_nfs_configure() {
+ global $freenas_config, $g;
+
+ /* kill any running nfsd */
+ killbyname("rpc.statd");
+ killbyname("rpc.lockd");
+ killbypid("{$g['varrun_path']}/mountd.pid");
+ forcekillbyname("nfsd");
+ killbyname("rpcbind");
+
+ if (isset($freenas_config['nfs']['enable'])) {
+ if ($g['booting']) { echo "Starting NFS... "; }
+
+ $nfsconf = "";
+ $a_nfsconf = array();
+
+ /* If no share configured, exit */
+ if (!is_array($freenas_config['mounts']['mount'])) { return 1; }
+
+ /* generate exports */
+ $fd = fopen("{$g['varetc_path']}/exports", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open exports in services_nfs_configure().\n");
+ return 1;
+ }
+
+ $a_mount = &$freenas_config['mounts']['mount'];
+ $pfnetworks = array();
+
+ foreach ($a_mount as $mount) {
+ /* -mapall and -maproot mutually exclusive */
+ $mapping = $mount['nfs']['mapall'] == "yes" ? "-mapall=root" : "-maproot=root";
+ $networks = isset($mount['nfs']['networks']) ? $mount['nfs']['networks'] : "";
+
+ $nfsconf = "/mnt/{$mount['sharename']} -alldirs {$mapping}";
+
+ if ($networks <> "") {
+ foreach (explode(",", $networks) as $netel) {
+ list($network,$subnet) =
+ explode('/', $netel);
+
+ $subnet = gen_subnet_mask($subnet);
+ $pfnetworks[] = $network;
+
+ $tmp_nfsconf .= "{$nfsconf} -network {$network} -mask {$subnet}\n";
+ }
+
+ services_setup_transparency_for("nfs", implode(" ", $pfnetworks));
+ $nfsconf = $tmp_nfsconf;
+ } else {
+ $nfsconf .= "\n";
+ }
+ }
+
+ fwrite($fd, $nfsconf);
+ fclose($fd);
+
+ $nfsdbindto = $freenas_config['nfs']['bindto'] = "(ANY)" ? " -a" : " -h {$freenas_config['nfs']['bindto']}";
+ $rpcbbindto = $freenas_config['nfs']['bindto'] = "(ANY)" ? "" : " -h {$freenas_config['nfs']['bindto']}";
+ $servetcp = isset($freenas_config['nfs']['servetcp']) ? " -t" : "";
+ $serveudp = isset($freenas_config['nfs']['serveudp']) ? " -u" : "";
+
+ /* run rpcbind, nfsd and mountd */
+ mwexec("/usr/sbin/rpcbind{$rpcbbindto}");
+ mwexec("/usr/sbin/nfsd{$nfsdbindto}{$serveudp}{$servetcp} -n 4");
+ mwexec("/usr/sbin/mountd -p 4711 -r {$g['varetc_path']}/exports");
+ mwexec("/usr/sbin/rpc.lockd");
+ mwexec("/usr/sbin/rpc.statd");
+
+ if ($g['booting']) { echo "done\n"; }
+ } else {
+ services_remove_transparency_for("nfs");
+ }// end if
+
+ return 0;
+}
+
+function services_remove_transparency_for($whom) {
+ global $g;
+
+ $service_result = mwexec ("pfctl -a \"passin-package-freenas-{$whom}\" -F rules");
+ if($service_result <> 0) {
+ file_notice("FREENAS", "There were error(s) flushing the exclude table", "FREENAS", "");
+ }
+
+ unlink_if_exists("{$g['pkg_path']}/pf/freenas-{$whom}.sh");
+}
+
+function services_setup_transparency_for($whom, $networks) {
+ global $g, $config, $freenas_config;
+
+ if ($whom == "" || $networks == "") { return; }
+
+ $generatedLANSubnet = gen_subnet($config['interfaces']['lan']['ipaddr'],
+ $config['interfaces']['lan']['subnet']);
+ $aliases = "";
+
+ /* stolen from filter.inc */
+ $real_wanif = get_real_wan_interface();
+ $wanip = find_interface_ip($real_wanif);
+
+ $wan_aliases = " " . link_ip_to_carp_interface($wanip);
+
+ if (link_int_to_bridge_interface("wan"))
+ $wan_aliases .= " " . link_int_to_bridge_interface("wan");
+
+ if ($config['interfaces']['wan']['ipaddr'] == "pppoe" or $config['interfaces']['wan']['ipaddr'] == "pptp") {
+ $aliases .= "ng0 = \"{ {$config['interfaces']['wan']['if']} {$real_wanif} }\" \n";
+ $aliases .= "wan = \"{ {$config['interfaces']['wan']['if']} {$wan_aliases} ng0 }\"\n";
+ } else {
+ $aliases .= "wan = \"{ {$real_wanif} {$wan_aliases} }\"\n";
+ }
+
+ $trans_file = fopen("/tmp/freenas-{$whom}.rules","w");
+ fwrite($trans_file, "{$aliases}\n");
+
+ switch ($whom) {
+ case "nfs":
+ $nfs_ports = explode(" ", NFS_SERVICE_PORTS);
+
+ foreach ($nfs_ports as $port) {
+ fwrite($trans_file, "pass in quick on \$wan proto { tcp udp } from { {$networks} } to {$freenas_config['nfs']['bindto']} port = {$port} keep state label \"FreeNAS related rule for {$whom}-{$port}\"\n");
+ }
+ break;
+ }
+ fclose($trans_file);
+ $service_result = mwexec ("pfctl -a \"passin-package-freenas-{$whom}\" -f /tmp/freenas-{$whom}.rules");
+ if($service_result <> 0) {
+ file_notice("FREENAS", "There were error(s) loading the transparency rules", "FREENAS", "");
+ }
+
+ /* create a shell script to make sure our filter rules
+ * are getting loaded upon each filter realod cycle.
+ */
+ $scriptstr = "#!/bin/sh\n\n";
+ $scriptstr .= "case $1 in\n";
+ $scriptstr .= " start)\n";
+ $scriptstr .= " if [ -f /tmp/freenas-nfs.rules ]; then\n";
+ $scriptstr .= " /sbin/pfctl -a \"passin-package-freenas-{$whom}\" -f /tmp/freenas-{$whom}.rules\n";
+ $scriptstr .= " fi\n";
+ $scriptstr .= " ;;\n";
+ $scriptstr .= " *)\n";
+ $scriptstr .= " echo \"Usage: $0 (start|stop|restart|status|log)\"\n";
+ $scriptstr .= " exit 1\n";
+ $scriptstr .= "esac\n";
+
+ file_put_contents("{$g['pkg_path']}/pf/freenas-{$whom}.sh", $scriptstr);
+ chmod("{$g['pkg_path']}/pf/freenas-{$whom}.sh", 0700);
+}
+
+function services_ftpd_configure() {
+ global $freenas_config, $g;
+ // services_vsftpd_configure();
+ // services_pureftpd_configure();
+ services_wzdftpd_configure();
+}
+
+function services_wzdftpd_configure() {
+ global $freenas_config, $config, $g;
+
+ /* kill any WZDFTPD */
+ killbyname("wzdftpd");
+
+ if (isset($freenas_config['ftp']['enable'])) {
+ if ($g['booting']) { echo "Starting FTP server... "; }
+
+ /* create missing dirs if necessary */
+ if (! file_exists("/var/log/wzdftpd")) { mkdir("/var/log/wzdftpd"); }
+ if (! file_exists("/usr/local/etc/wzdftpd")) { mkdir("/usr/local/etc/wzdftpd"); }
+
+ /* generate wzd.cfg */
+ chmod("/usr/local/etc/wzdftpd/wzd.cfg", 0600);
+ $fd = fopen("/usr/local/etc/wzdftpd/wzd.cfg", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open vsftpd.conf in services_vsftpd_configure().\n");
+ return 1;
+ }
+
+ $ftpconf = <<<EOD
+[GLOBAL]
+config version = 0.7.2
+backup config = true
+port = {$freenas_config['ftp']['port']}
+
+EOD;
+
+ if ($freenas_config['ftp']['pasv_min_port'] && $freenas_config['ftp']['pasv_max_port']) {
+ $ftpconf .= <<<EOD
+pasv_low_range = {$freenas_config['ftp']['pasv_min_port']}
+pasv_high_range = {$freenas_config['ftp']['pasv_max_port']}
+
+EOD;
+ }
+
+ $ftpconf .= <<<EOD
+
+pasv_ip = {$freenas_config['ftp']['pasv_address']}
+dir_message = .message
+logfile = /var/log/wzdftpd/wzd.log
+xferlog = /var/log/wzdftpd/xferlog
+logdir = /var/log/wzdftpd
+max_threads = {$freenas_config['ftp']['numberclients']}
+
+backend = /usr/local/share/wzdftpd/backends/libwzd{$freenas_config['ftp']['authentication_backend']}.so
+
+max_ul_speed = 0
+max_dl_speed = 0
+deny_access_files_uploaded = 1
+
+tls_certificate = /usr/local/etc/wzdftpd/wzd.pem
+sitefile_ginfo = /usr/local/etc/wzdftpd/file_ginfo.txt
+sitefile_group = /usr/local/etc/wzdftpd/file_group.txt
+sitefile_user = /usr/local/etc/wzdftpd/file_user.txt
+
+[pre_ip_check]
+localhost = allow
+
+[perms]
+site_addip = +O +G
+site_adduser = +O +G
+site_backend = +O
+site_chacl = +O
+site_change = +O +G
+site_changegrp = +O +G
+site_checkperm = +O
+site_chgrp = +O
+site_chmod = +O
+site_chown = +O
+site_chpass = *
+site_chratio = +O +G
+site_close = +O
+site_color = !=guest *
+site_delip = +O +G
+site_deluser = +O +G
+site_flags = -admin
+site_free = *
+site_ginfo = +O +G
+site_give = *
+site_group = +O
+site_groups = +O
+site_grpadd = +O
+site_grpaddip = +O
+site_grpchange = +O
+site_grpdel = +O
+site_grpdelip = +O
+site_grpkill = +O
+site_grpratio = +O
+site_grpren = +O
+site_gsinfo = +O +G
+site_help = *
+
+EOD;
+
+ if (! empty($freenas_config['ftp']['timeout'])) {
+ $ftpconf .= "site_idle ={$freenas_config['ftp']['timeout']}\n";
+ } else {
+ $ftpconf .= "site_idle = *\n";
+ }
+
+ $ftpconf .= <<<EOD
+site_invite = !=guest *
+site_kick = +O
+site_kill = +O
+site_link = +O
+site_msg = +O
+site_perm = +O
+site_purge = +O +G
+site_readd = +O +G
+site_reload = +O
+site_reopen = +O
+site_rules = *
+site_rusage = +O
+site_savecfg = +O
+site_sections = +O
+site_shutdown = +O
+site_su = +O
+site_swho = +O
+site_tagline = !=guest *
+site_take = +O
+site_unlock = +O
+site_uptime = *
+site_user = +O +G
+site_users = -admin
+site_utime = *
+site_vars = +O
+site_vars_group = +O
+site_vars_user = +O
+site_version = +O
+site_who = !=guest *
+site_wipe = +O
+site_vfsls = +O
+site_vfsadd = +O
+site_vfsdel = +O
+
+[modules]
+/usr/local/share/wzdftpd/modules/libwzd_debug.so = deny
+/usr/local/share/wzdftpd/modules/libwzd_test.so = deny
+/usr/local/share/wzdftpd/modules/libwzd_sfv.so = allow
+/usr/local/share/wzdftpd/modules/libwzd_tcl.so = deny
+/usr/local/share/wzdftpd/modules/libwzd_perl.so = deny
+
+EOD;
+
+ if (empty($config['system']['zeroconf_disable'])) {
+ $ftpconf .= <<<EOD
+/usr/local/share/wzdftpd/modules/libwzd_zeroconf.so = allow
+
+[ZEROCONF]
+zeroconf_port = {$freenas_config['ftp']['port']}
+zeroconf_username = wzdftpd
+zeroconf_password = wzdftpd
+zeroconf_path = /
+
+EOD;
+
+ }
+
+ $ftpconf .= <<<EOD
+
+[sfv]
+progressmeter = [WzD] - %3d%% Complete - [WzD]
+del_progressmeter = \[.*] - ...% Complete - \[WzD]
+incomplete_indicator = ../(incomplete)-%0
+other_completebar = [WzD] - ( %.0mM %fF - COMPLETE ) - [WzD]
+
+[plaintext]
+param = /usr/local/etc/wzdftpd/users
+
+[sections]
+ALL = /* ^([]\[A-Za-z0-9_.'() \\t+-])*\$
+
+[cron]
+
+[events]
+
+[custom_commands]
+site_rules = !/usr/local/etc/wzdftpd/file_rules.txt
+
+site_groups = !/usr/local/etc/wzdftpd/file_groups.txt
+site_help = !/usr/local/etc/wzdftpd/file_help.txt
+site_swho = !/usr/local/etc/wzdftpd/file_swho.txt
+site_users = !/usr/local/etc/wzdftpd/file_users.txt
+site_vfsls = !/usr/local/etc/wzdftpd/file_vfs.txt
+site_who = !/usr/local/etc/wzdftpd/file_who.txt
+
+[vfs]
+
+[messages]
+
+EOD;
+
+ if (isset($freenas_config['ftp']['banner'])) {
+ $ftpconf .= "200 = {$freenas_config['ftp']['banner']}";
+ } else {
+ $ftpconf .= "200 = Welcome to pfSense FTP service";
+ }
+
+ fwrite($fd, $ftpconf);
+ fclose($fd);
+ chmod("/usr/local/etc/wzdftpd/wzd.cfg", 0400);
+
+ /* now generate the plaintext users file (if applicable) */
+ if ($freenas_config['ftp']['authentication_backend'] == FTP_BACKEND_PLAINTEXT) {
+ $ftpusers = "[GROUPS]\n";
+ $a_group =& $config['system']['group'];
+ $a_user =& $config['system']['user'];
+
+ for ($i = 0; $i < count($a_group); $i++) {
+ $group = $a_group[$i];
+ $gid = $i + 1;
+
+ $ftpusers .= <<<EOD
+
+privgroup {$group['name']}
+gid={$gid}
+default_home=/
+
+EOD;
+ } // end foreach
+
+ /* anonymous group */
+ if (! empty($freenas_config['ftp']['anonymous'])) {
+ $ftpusers .= <<<EOD
+
+privgroup anonymous
+max_idle_time=10
+gid=3
+default_home=/home
+
+EOD;
+ }
+
+ /* same for users */
+ $ftpusers .= "[USERS]\n";
+ for ($i = 0; $i < count($a_user); $i++) {
+ $user = $a_user[$i];
+ $ftpusers .= <<<EOD
+
+name={$user['name']}
+pass={$user['password']}
+home=/
+uid={$i}
+groups={$user['groupname']}
+rights=0xffffffff
+
+EOD;
+ } // end foreach
+
+ /* anonymous user */
+ if (! empty($freenas_config['ftp']['anonymous'])) {
+ $ftpusers .= <<<EOD
+
+name=guest
+pass=%
+home=/tmp
+uid=200
+groups=anonymous
+rights=0x10003
+ip_allowed=*
+max_dl_speed=20480
+credits=0
+bytes_ul_total=0
+bytes_dl_total=1918812
+num_logins=2
+
+EOD;
+ } // end if
+
+ $ftpusers .= "[HOSTS]\nall = *\n";
+ chmod("/usr/local/etc/wzdftpd/users", 0600);
+ file_put_contents("/usr/local/etc/wzdftpd/users", $ftpusers);
+ chmod("/usr/local/etc/wzdftpd/users", 0400);
+ } // end if
+
+ /* run vsftpd */
+ mwexec("/usr/local/sbin/wzdftpd -f /usr/local/etc/wzdftpd/wzd.cfg");
+
+ if ($g['booting']) { echo "done\n"; }
+ } // end if
+
+ return 0;
+}
+
+/* this function is currently not used */
+function services_vsftpd_configure() {
+ global $freenas_config, $g;
+
+ /* kill any VSFTPD */
+ killbyname("vsftpd");
+
+ if (isset($freenas_config['ftp']['enable'])) {
+ if ($g['booting']) { echo "Starting FTP server... "; }
+
+ /* generate vfstpd.conf */
+ $fd = fopen("{$g['varetc_path']}/vsftpd.conf", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open vsftpd.conf in services_vsftpd_configure().\n");
+ return 1;
+ }
+
+ $ftpconf = <<<EOD
+# Standalone mode
+listen=YES
+background=YES
+listen_port={$freenas_config['ftp']['port']}
+max_clients={$freenas_config['ftp']['numberclients']}
+max_per_ip={$freenas_config['ftp']['maxconperip']}
+xferlog_enable=YES
+#vsftpd_log_file=/var/log/ftp.log
+syslog_enable=YES
+# Access rights
+anonymous_enable={$freenas_config['ftp']['anonymous']}
+local_enable={$freenas_config['ftp']['localuser']}
+write_enable=YES
+hide_file=.snap
+anon_other_write_enable=YES
+anon_upload_enable=YES
+anon_mkdir_write_enable=YES
+chroot_local_user=YES
+local_umask=066
+anon_umask=066
+chmod_enable=YES
+pasv_address={$freenas_config['ftp']['pasv_address']}
+# Features
+ls_recurse_enable=YES
+# Performance
+idle_session_timeout={$freenas_config['ftp']['timeout']}
+
+EOD;
+ if (isset($freenas_config['ftp']['banner'])) {
+ $ftpconf .= <<<EOD
+ftpd_banner={$freenas_config['ftp']['banner']}
+
+EOD;
+ } else {
+ $ftpconf .= <<<EOD
+ftpd_banner=Welcome to pfSense FTP service
+
+EOD;
+ }
+
+ if ($freenas_config['ftp']['pasv_min_port'] && $freenas_config['ftp']['pasv_max_port']) {
+ $ftpconf .= <<<EOD
+pasv_max_port={$freenas_config['ftp']['pasv_max_port']}
+pasv_min_port={$freenas_config['ftp']['pasv_min_port']}
+
+EOD;
+ }
+
+ if ($freenas_config['ftp']['pasv_address']) {
+ $ftpconf .= <<<EOD
+pasv_address={$freenas_config['ftp']['pasv_address']}
+
+EOD;
+ }
+
+ fwrite($fd, $ftpconf);
+ fclose($fd);
+
+ /* run vsftpd */
+ mwexec("/usr/local/sbin/vsftpd {$g['varetc_path']}/vsftpd.conf");
+
+ if ($g['booting']) { echo "done\n"; }
+ }
+
+ return 0;
+}
+
+function services_pureftpd_configure() {
+ global $freenas_config, $g;
+
+ /* kill any Pure-FTPD */
+ killbyname("pure-ftpd");
+
+ if (isset($freenas_config['ftp']['enable'])) {
+ if ($g['booting']) { echo "Starting FTP server... "; }
+
+ /* Generate the banner file */
+ $fd = fopen("/mnt/.banner", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open .banner in services_pureftpd_configure().\n");
+ return 1;
+ }
+
+ if (empty($freenas_config['ftp']['banner'])) {
+ $banner = <<<EOD
+Welcome to pfSense FTP service
+
+EOD;
+ } else {
+ $banner = <<<EOD
+{$freenas_config['ftp']['banner']}
+
+EOD;
+ } // end if
+
+ fwrite($fd, $banner);
+ fclose($fd);
+
+ /* run pure-ftpd */
+ $cmd = "/usr/local/sbin/pure-ftpd -S {$freenas_config['ftp']['port']} -c {$freenas_config['ftp']['numberclients']} -C {$freenas_config['ftp']['maxconperip']} -I {$freenas_config['ftp']['timeout']} -M U 077:077 -B -b ";
+
+ if ( (isset($freenas_config['ftp']['anonymous'])) && (!isset($freenas_config['ftp']['localuser']))) {
+ $cmd .= "-e ";
+ }
+
+ if ( (!isset($freenas_config['ftp']['anonymous'])) && (isset($freenas_config['ftp']['localuser']))) {
+ $cmd .= "-E ";
+ }
+
+ if ($freenas_config['ftp']['pasv_min_port'] && $freenas_config['ftp']['pasv_max_port']) {
+ $cmd .= "-p {$freenas_config['ftp']['pasv_min_port']}:{$freenas_config['ftp']['pasv_max_port']} ";
+ }
+
+ if ($freenas_config['ftp']['pasv_address']) {
+ $cmd .= "-P {$freenas_config['ftp']['pasv_address']} ";
+ }
+
+ if ($freenas_config['ftp']['natmode']) {
+ $cmd .= "-N ";
+ }
+
+ if ($freenas_config['ftp']['passiveip']) {
+ $cmd .= "-P {$freenas_config['ftp']['passiveip']} ";
+ }
+
+ if ($freenas_config['ftp']['fxp']) {
+ $cmd .= "-W ";
+ }
+
+ mwexec($cmd);
+
+ if ($g['booting']) { echo "done\n"; }
+ } // end if
+
+ return 0;
+}
+
+/* Stop smartd, Generate the configuration file and start
+ * smartd Return 0 if OK, 1 or error code if error
+ */
+function services_smart_configure() {
+ global $config, $g;
+
+ /* kill any running smartd */
+ killbyname("smartd");
+
+ if (isset($config['system']['smart'])) {
+ if ($g['booting']) { echo "Starting smartd... "; }
+
+ /* run smartd */
+ mwexec("/usr/local/sbin/smartd --logfacility=local5");
+
+ if ($g['booting']) { echo "done\n"; }
+ }
+
+ return 0;
+}
+
+/* Generate the unison configuration
+ * Return 0 if OK, 1 or error code if error
+ */
+function services_unison_configure() {
+ global $freenas_config, $g;
+ $result = 0 ;
+
+ if ($g['booting']) { echo "Configuring unison... \n"; }
+
+ if (isset($freenas_config['unison']['enable'])) {
+ /* ensure unison workdir exists */
+ $workdir = "/mnt/{$freenas_config['unison']['share']}/{$config['unison']['workdir']}";
+
+ if (isset($freenas_config['unison']['makedir']) && !file_exists($workdir)) {
+ if (!mkdir($workdir)) {
+ printf("Error: cannot mkdir $workdir in services_unison_configure().\n");
+ }
+
+ exec("/bin/chmod 775 $workdir");
+ }
+
+ if (!file_exists($workdir)) {
+ printf("Error: cannot open $workdir in services_unison_configure().\n");
+ $result = 1 ;
+ }
+
+ /* add workdir to login.conf UNISON environment variable */
+ $logfile = "{$g['etc_path']}/login.conf";
+
+ if (!file_exists("$logfile")) {
+ printf("Error: $logfile doesn't exist, in services_unison_configure().\n");
+ $result = 1 ;
+ }
+
+ $tmp = file_get_contents("$logfile");
+ $search = "/UNISON=.*?(?=[,:])/";
+
+ if (!preg_match($search, $tmp)) {
+ printf("Error: cannot find UNISON in $logfile, in services_unison_configure().\n");
+ $result = 1 ;
+ }
+
+ $tmp = preg_replace($search, "UNISON=$workdir", $tmp);
+
+ if (!file_put_contents($logfile, $tmp)) {
+ printf("Error: couldn't write $logfile, in services_unison_configure().\n");
+ $result = 1 ;
+ }
+ } // end if
+
+ $tmp = "";
+
+ return $result;
+}
+
+/* Stop and start ushare
+ * Return 0 if OK, 1 or error code if error
+ */
+function services_ushare_configure() {
+ global $freenas_config, $g;
+
+ $result = 0 ;
+
+ /* Kill any running uShare */
+ killbyname("ushare");
+
+ /* Delete multicast route. */
+ mwexec("/sbin/route delete -net 239.0.0.0");
+
+ if(isset($freenas_config['upnp']['enable'])) {
+ if($g['booting']) { echo "Starting UPnP server... "; }
+
+ /* Setup a multicast route for UPnP messages. */
+ // TODO: where to get the upnp iface?
+ $result = mwexec("/sbin/route add -net 239.0.0.0 -netmask 255.0.0.0 -interface " . escapeshellarg($freenas_config['upnp']['if']));
+
+ $content = "";
+ foreach($freenas_config['upnp']['content'] as $contentv) {
+ $content .= " --content=$contentv";
+ }
+
+ /* Run uShare as daemon. */
+ // TODO: where to get the upnp iface?
+ $result |= mwexec("/usr/local/bin/ushare --daemon --no-web --name={$freenas_config['upnp']['name']} --interface={$freenas_config['upnp']['if']} {$content}");
+ } // end if
+
+ return $result;
+}
+
+function services_cron_configure() {
+ global $freenas_config, $g;
+
+ /* kill any running cron */
+ killbyname("cron");
+
+ /* ======================================================================= */
+ /* = configure crontab item for rsyncclient = */
+ /* ======================================================================= */
+ if (isset($freenas_config['rsyncclient']['enable'])) {
+ if ($g['booting']) { echo "Configuring cron for rsync client... "; }
+
+ if ($freenas_config['rsyncclient']['all_mins'] == "0") {
+ foreach ($freenas_config['rsyncclient']['minute'] as $minutev) {
+ if (strlen($cron_min) > 0) {
+ $cron_min = $cron_min . "," . $minutev;
+ } else {
+ $cron_min = $minutev;
+ }
+ } // end foreach
+ } else {
+ $cron_min = "*";
+ } // end if
+
+ if ($freenas_config['rsyncclient']['all_hours'] == "0") {
+ foreach ($freenas_config['rsyncclient']['hour'] as $hourv) {
+ if (strlen($cron_hour) > 0) {
+ $cron_hour = $cron_hour . "," . $hourv;
+ } else {
+ $cron_hour = $hourv;
+ }
+ } // end foreach
+ } else {
+ $cron_hour = "*";
+ } // end if
+
+ if ($freenas_config['rsyncclient']['all_days'] == "0") {
+ foreach ($freenas_config['rsyncclient']['day'] as $dayv) {
+ if (strlen($cron_day) > 0) {
+ $cron_day = $cron_day . "," . $dayv;
+ } else {
+ $cron_day = $dayv;
+ }
+ } // end foreach
+ } else {
+ $cron_day = "*";
+ } // end if
+
+ if ($freenas_config['rsyncclient']['all_months'] == "0") {
+ foreach ($freenas_config['rsyncclient']['month'] as $monthv) {
+ if (strlen($cron_month) > 0) {
+ $cron_month = $cron_month . "," . $monthv;
+ } else {
+ $cron_month = $monthv;
+ }
+ } // end foreach
+ } else {
+ $cron_month = "*";
+ } // end if
+
+ if ($freenas_config['rsyncclient']['all_weekday'] == "0") {
+ foreach ($freenas_config['rsyncclient']['weekday'] as $weekdayv) {
+ if (strlen($cron_weekday) > 0) {
+ $cron_weekday = $cron_weekday . "," . $weekdayv;
+ } else {
+ $cron_weekday = $weekdayv;
+ }
+ } // end foreach
+ } else {
+ $cron_weekday = "*";
+ } // end if
+
+ $cron_item = array();
+ $cron_item['minute'] = "{$cron_min}";
+ $cron_item['hour'] = "{$cron_hour}";
+ $cron_item['mday'] = "{$cron_day}";
+ $cron_item['month'] = "{$cron_month}";
+ $cron_item['wday'] = "{$cron_weekday}";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "{$g['varrun_path']}/sync.sh";
+
+ $config['cron']['item'][] = $cron_item;
+
+ if ($g['booting']) { echo "done\n"; }
+ } // end if
+
+ /* Erase all variable used previously */
+ unset ($cron_min, $cron_hour, $cron_day, $cron_month, $cron_weekday);
+
+ /* ======================================================================= */
+ /* = configure crontab item for rsync local part = */
+ /* ======================================================================= */
+ if (isset($freenas_config['rsync_local']['enable'])) {
+ if ($g['booting']) { echo "Configuring cron for local rsync... "; }
+
+ if ($freenas_config['rsync_local']['all_mins'] == "0") {
+ foreach ($freenas_config['rsync_local']['minute'] as $minutev) {
+ if (strlen($cron_min) > 0) {
+ $cron_min = $cron_min . "," . $minutev;
+ } else {
+ $cron_min = $minutev;
+ }
+ } // end foreach
+ } else {
+ $cron_min = "*";
+ } // end if
+
+ if ($freenas_config['rsync_local']['all_hours'] == "0") {
+ foreach ($freenas_config['rsync_local']['hour'] as $hourv) {
+ if (strlen($cron_hour) > 0) {
+ $cron_hour = $cron_hour . "," . $hourv;
+ } else {
+ $cron_hour = $hourv;
+ }
+ } // end foreach
+ } else {
+ $cron_hour = "*";
+ } // end if
+
+ if ($freenas_config['rsync_local']['all_days'] == "0") {
+ foreach ($freenas_config['rsync_local']['day'] as $dayv) {
+ if (strlen($cron_day) > 0) {
+ $cron_day = $cron_day . "," . $dayv;
+ } else {
+ $cron_day = $dayv;
+ }
+ } // end foreach
+ } else {
+ $cron_day = "*";
+ } // end if
+
+ if ($freenas_config['rsync_local']['all_months'] == "0") {
+ foreach ($freenas_config['rsync_local']['month'] as $monthv) {
+ if (strlen($cron_month) > 0) {
+ $cron_month = $cron_month . "," . $monthv;
+ } else {
+ $cron_month = $monthv;
+ }
+ } // end foreach
+ } else {
+ $cron_month = "*";
+ } // end if
+
+ if ($freenas_config['rsync_local']['all_weekday'] == "0") {
+ foreach ($freenas_config['rsync_local']['weekday'] as $weekdayv) {
+ if (strlen($cron_weekday) > 0) {
+ $cron_weekday = $cron_weekday . "," . $weekdayv;
+ } else {
+ $cron_weekday = $weekdayv;
+ }
+ } // end foreach
+ } else {
+ $cron_weekday = "*";
+ }
+
+ $cron_item = array();
+ $cron_item['minute'] = "{$cron_min}";
+ $cron_item['hour'] = "{$cron_hour}";
+ $cron_item['mday'] = "{$cron_day}";
+ $cron_item['month'] = "{$cron_month}";
+ $cron_item['wday'] = "{$cron_weekday}";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "{$g['varrun_path']}/sync.sh";
+
+ $config['cron']['item'][] = $cron_item;
+
+ if ($g['booting']) { echo "done\n"; }
+ }
+
+ /* Erase all variable used previously */
+ unset ($cron_min, $cron_hour, $cron_day, $cron_month, $cron_weekday);
+
+ /* ======================================================================= */
+ /* = configure crontab item shutdown part = */
+ /* ======================================================================= */
+ if (isset($freenas_config['shutdown']['enable'])) {
+ if ($g['booting']) { echo "Configuring cron for shutdown... "; }
+
+ if ($freenas_config['shutdown']['all_mins'] == "0") {
+ foreach ($freenas_config['shutdown']['minute'] as $minutev) {
+ if (strlen($cron_min) > 0) {
+ $cron_min = $cron_min . "," . $minutev;
+ } else {
+ $cron_min = $minutev;
+ }
+ } // end foreach
+ } else {
+ $cron_min = "*";
+ } // end if
+
+ if ($freenas_config['shutdown']['all_hours'] == "0") {
+ foreach ($freenas_config['shutdown']['hour'] as $hourv) {
+ if (strlen($cron_hour) > 0) {
+ $cron_hour = $cron_hour . "," . $hourv;
+ } else {
+ $cron_hour = $hourv;
+ }
+ } // end foreach
+ } else {
+ $cron_hour = "*";
+ } // end if
+
+ if ($freenas_config['shutdown']['all_days'] == "0") {
+ foreach ($freenas_config['shutdown']['day'] as $dayv) {
+ if (strlen($cron_day) > 0) {
+ $cron_day = $cron_day . "," . $dayv;
+ } else {
+ $cron_day = $dayv;
+ }
+ } // end foreach
+ } else {
+ $cron_day = "*";
+ } // end if
+
+ if ($freenas_config['shutdown']['all_months'] == "0") {
+ foreach ($freenas_config['shutdown']['month'] as $monthv) {
+ if (strlen($cron_month) > 0) {
+ $cron_month = $cron_month . "," . $monthv;
+ } else {
+ $cron_month = $monthv;
+ }
+ } // end foreach
+ } else {
+ $cron_month = "*";
+ } // end if
+
+ if ($freenas_config['shutdown']['all_weekday'] == "0") {
+ foreach ($freenas_config['shutdown']['weekday'] as $weekdayv) {
+ if (strlen($cron_weekday) > 0) {
+ $cron_weekday = $cron_weekday . "," . $weekdayv;
+ } else {
+ $cron_weekday = $weekdayv;
+ }
+ } // end foreach
+ } else {
+ $cron_weekday = "*";
+ } // end if
+
+ $cron_item = array();
+ $cron_item['minute'] = "{$cron_min}";
+ $cron_item['hour'] = "{$cron_hour}";
+ $cron_item['mday'] = "{$cron_day}";
+ $cron_item['month'] = "{$cron_month}";
+ $cron_item['wday'] = "{$cron_weekday}";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "{$g['varrun_path']}/sync.sh";
+
+ $config['cron']['item'][] = $cron_item;
+
+ if ($g['booting']) { echo "done\n"; }
+ } // end if
+
+ /* call the pfSense configure_cron function */
+ configure_cron();
+
+ /* run cron */
+ mwexec("/usr/sbin/cron -s");
+
+ return 0;
+}
+
+function services_rsyncclient_configure() {
+ global $freenas_config, $g;
+
+ // Generate a shell script that is used by cron
+ // Generate crontab works
+ if (isset($freenas_config['rsyncclient']['enable'])) {
+ if ($g['booting']) { echo "Generating synchronizing cron script... "; }
+
+ /* generate /var/run/sync.sh script */
+ $fd = fopen("{$g['varrun_path']}/sync.sh", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open /var/run/sync.sh in services_rsyncclient_configure().\n");
+ return 1;
+ }
+
+ $syncscript = <<<EOD
+#!/bin/sh
+
+if [ -r /var/run/rsync-running ]; then
+exit
+fi
+/usr/bin/touch /var/run/rsync-running
+
+EOD;
+
+ $opt_delete="";
+ if (isset($freenas_config['rsyncclient']['opt_delete'])) {
+ $opt_delete = "--delete --delete-after ";
+ }
+
+ foreach ($freenas_config['rsyncclient']['sharetosync'] as $sharek => $sharev) {
+ $syncscript .= <<<EOD
+/usr/local/bin/rsync -rtz {$opt_delete}rsync://{$freenas_config['rsyncclient']['rsyncserverip']}/{$sharev} /mnt/{$sharev}
+
+EOD;
+ } // end foreach
+
+ $syncscript .= <<<EOD
+/bin/rm -f /var/run/rsync-running
+
+EOD;
+
+ fwrite($fd,$syncscript);
+ fclose($fd);
+
+ /* Add exectutive right to the script */
+ exec("/bin/chmod 770 {$g['varrun_path']}/sync.sh");
+
+ if ($g['booting']) { echo "done\n"; }
+ } // end if
+
+ return 0;
+}
+
+function services_rsync_local_configure() {
+ global $freenas_config, $g;
+
+ // Generate a shell script that is used by cron
+ // Generate crontab works
+ if (isset($freenas_config['rsync_local']['enable'])) {
+ if ($g['booting']) { echo "Generating local rsync cron script... "; }
+
+ /* generate /var/run/sync_local.sh script */
+ $fd = fopen("{$g['varrun_path']}/sync_local.sh", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open /var/run/sync_local.sh in services_rsync_local_configure().\n");
+ return 1;
+ }
+
+ $syncscript = <<<EOD
+#!/bin/sh
+
+if [ -r /var/run/rsync_local-running ]; then
+exit
+fi
+/usr/bin/touch /var/run/rsync_local-running
+
+EOD;
+
+ $opt_delete="";
+ if (isset($freenas_config['rsync_local']['opt_delete'])) {
+ $opt_delete = "--delete --delete-after ";
+ }
+
+ $syncscript .= <<<EOD
+/usr/local/bin/rsync -a {$opt_delete} /mnt/{$freenas_config['rsync_local']['source']} /mnt/{$freenas_config['rsync_local']['destination']}
+
+EOD;
+
+ $syncscript .= <<<EOD
+/bin/rm -f /var/run/rsync_local-running
+
+EOD;
+
+ fwrite($fd,$syncscript);
+ fclose($fd);
+
+ /* Add exectutive right to the script */
+ exec("/bin/chmod 770 {$g['varrun_path']}/sync_local.sh");
+
+ if ($g['booting']) { echo "done\n"; }
+ } // end if
+
+ return 0;
+}
+
+function services_radius_configure() {
+ global $freenas_config, $g;
+
+ if (isset($config['radius']['enable'])) {
+ /* generate radius.conf */
+ $fd = fopen("{$g['varetc_path']}/radius.conf", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open radius.conf in services_radius_configure().\n");
+ return 1;
+ }
+
+ $radiusconf = <<<EOD
+auth {$config['radius']['radiusip']}:{$config['radius']['port']} {$config['radius']['secret']} {$config['radius']['timeout']} {$config['radius']['maxretry']}
+
+EOD;
+
+ fwrite($fd, $radiusconf);
+ fclose($fd);
+ } // end if
+
+ return 0;
+}
+
+/* Stop, Generate the config file and start
+ * AFP Return 0 if OK, 1 or error code if error
+ */
+function services_afpd_configure() {
+ global $freenas_config, $config, $g;
+
+ /* kill any afpd */
+ killbyname("afpd");
+
+ if (isset($freenas_config['afp']['enable'])) {
+ /* If no share configured, exit */
+ if (!is_array($freenas_config['mounts']['mount'])) { return 1; }
+ if ($g['booting']) { echo "Starting AFP server... "; }
+
+ if (empty($freenas_config['afp']['afpname'])) {
+ $afpname="-";
+ } else {
+ $afpname=$freenas_config['afp']['afpname'];
+ }
+
+ /* generate afpd.conf */
+ $fd = fopen("{$g['varetc_path']}/afpd.conf", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open afpd.conf in services_afpd_configure().\n");
+ return 1;
+ }
+
+ $afpconf = <<<EOD
+{$afpname} -transall -uamlist
+EOD;
+
+ if (empty($config['system']['zeroconf_disable'])) {
+ $afpconf .= <<<EOD
+ -noslp -fqdn {$config['system']['hostname']}.{$config['system']['domain']} -uamlist
+EOD;
+ } else {
+ $afpconf .= <<<EOD
+ -noslp -nozeroconf -uamlist
+EOD;
+ } // end if
+
+ if (isset($freenas_config['afp']['guest']) && isset($freenas_config['afp']['local']) ) {
+ $afpconf .= <<<EOD
+ uams_guest.so,uams_clrtxt.so,uams_dhx.so
+EOD;
+ } else if (isset($freenas_config['afp']['guest'])) {
+ $afpconf .= <<<EOD
+ uams_guest.so
+EOD;
+ } else if (isset($freenas_config['afp']['local'])) {
+ $afpconf .= <<<EOD
+ uams_clrtxt.so,uams_dhx.so
+EOD;
+ }
+
+ $afpconf .= <<<EOD
+ -nosavepassword -defaultvol {$g['varetc_path']}/AppleVolumes.default -systemvol {$g['varetc_path']}/AppleVolumes.system -uampath /etc/uams -guestname ftp
+
+EOD;
+
+ fwrite($fd, $afpconf);
+ fclose($fd);
+
+ /* generate AppleVolumes.default */
+ $fd = fopen("{$g['varetc_path']}/AppleVolumes.default", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open AppleVolumes.default in services_afpd_configure().\n");
+ return 1;
+ }
+
+ $a_mount = &$freenas_config['mounts']['mount'];
+
+ foreach ($a_mount as $mount) {
+ $AppleVolumes .= <<<EOD
+/mnt/{$mount['sharename']} "{$mount['sharename']}"
+
+EOD;
+
+ } // end foreach
+
+ fwrite($fd, $AppleVolumes);
+ fclose($fd);
+
+ /* run afpdpd */
+ mwexec("/usr/local/sbin/afpd -F {$g['varetc_path']}/afpd.conf");
+
+ if ($g['booting']) { echo "done\n"; }
+ } // end if
+
+ return 0;
+}
+
+function services_nis_configure() {
+ global $freenas_config, $g;
+
+ return 0;
+}
+
+/* Start iscsi initiator
+ * Return 0 if Ok, 1 or error code if problem
+ */
+/* TODO: NEED TO STOP IT TOO ??? */
+function services_iscsi_configure() {
+ global $freenas_config, $g;
+
+ if (isset($freenas_config['iscsi']['enable'])) {
+ if ($g['booting']) { echo "Starting iSCSI driver... "; }
+
+ $result = mwexec("/sbin/kldload kdload /boot/kernel/iscsi_initiator.ko");
+ $result |= mwexec("/sbin/sysctl debug.iscsi=0");
+ $result |= mwexec("/usr/local/sbin/iscontrol targetaddress={$freenas_config['iscsi']['targetaddress']} TargetName={$freenas_config['iscsi']['targetname']}");
+
+ if ($g['booting']) { echo "done\n"; }
+ }
+
+ if (isset($result)) { return $result; }
+ return 0;
+}
+
+function services_zeroconf_configure() {
+ //services_mdnsresponder_configure();
+ //services_howl_configure();
+ return services_avahi_configure();
+}
+
+function services_avahi_configure() {
+ global $freenas_config, $config, $g;
+
+ $service_template = <<<EOD
+<?xml version="1.0" standalone='no'?>
+<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
+<service-group>
+
+ <name replace-wildcards="yes">@SERVICE_DESC@ on %h</name>
+
+ <service>
+ <type>@TYPE@</type>
+ <port>@PORT@</port>
+ @TXT_RECORDS@
+ </service>
+
+</service-group>
+
+EOD;
+
+ /* kill any running dbus daemon */
+ sigkillbypid("{$g['varrun_path']}/dbus/dbus.pid", "TERM");
+
+ unlink_if_exists("{$g['varrun_path']}/dbus/dbus.pid");
+
+ /* kill any running avahi daemons */
+ mwexec("/usr/local/sbin/avahi-daemon -k");
+
+ /* simply return if zeroconf isn't enabled */
+ if (isset($config['system']['zeroconf_disable'])) { return 0; }
+
+ /* configure Avahi and it's dependencies */
+ if (! file_exists("/usr/local/etc/avahi/services")) {
+ mwexec("mkdir -p /usr/local/etc/avahi/services");
+ }
+
+ /* add HTTP service type */
+ $webproto = $config['system']['webgui']['protocol'];
+
+ if (isset($config['system']['webgui']['port'])) {
+ $webservice = str_replace("@PORT@",
+ $config['system']['webgui']['port'],
+ $service_template);
+ $webservice = str_replace("@TYPE@",
+ "_{$webproto}._tcp",
+ $webservice);
+ $webservice = str_replace("@SERVICE_DESC@",
+ "pfSense webGUI",
+ $webservice);
+ $webservice = str_replace("@TXT_RECORDS@",
+ "",
+ $webservice);
+
+ file_put_contents("/usr/local/etc/avahi/services/http.service", $webservice);
+ } else {
+ $webservice = str_replace("@PORT@",
+ "80",
+ $service_template);
+ $webservice = str_replace("@TYPE@",
+ "_{$webproto}._tcp",
+ $webservice);
+ $webservice = str_replace("@SERVICE_DESC@",
+ "pfSense webGUI",
+ $webservice);
+ $webservice = str_replace("@TXT_RECORDS@",
+ "",
+ $webservice);
+
+ file_put_contents("/usr/local/etc/avahi/services/http.service", $webservice);
+ } // end if
+
+ /* afp is announcing itself */
+ if (isset($freenas_config['afp']['enable'])) {
+ /* NOP */
+ }
+
+ /* add rsync service type */
+ if (isset($freenas_config['rsyncd']['enable'])) {
+ $rsyncservice = str_replace("@PORT@",
+ $freenas_config['rsyncd']['port'],
+ $service_template);
+ $rsyncservice = str_replace("@TYPE@",
+ "_rsync._tcp",
+ $rsyncservice);
+ $rsyncservice = str_replace("@SERVICE_DESC@",
+ "Remote Sync Daemon",
+ $rsyncservice);
+ $rsyncservice = str_replace("@TXT_RECORDS@",
+ "",
+ $rsyncservice);
+
+ file_put_contents("/usr/local/etc/avahi/services/rsync.service", $rsyncservice);
+ } // end if
+
+ /* add ntp service type */
+ if ($config['ntpd']['mode'] == "server") {
+ $ntpdservice = str_replace("@PORT@",
+ "123",
+ $service_template);
+ $ntpdservice = str_replace("@TYPE@",
+ "_ntp._udp",
+ $ntpdservice);
+ $ntpdservice = str_replace("@SERVICE_DESC@",
+ "Network Time Daemon",
+ $ntpdservice);
+ $ntpdservice = str_replace("@TXT_RECORDS@",
+ "",
+ $ntpdservice);
+
+ file_put_contents("/usr/local/etc/avahi/services/ntpd.service", $ntpdservice);
+ } // end if
+
+ if (isset($config['system']['ssh']['enable'])) {
+ $sshservice = str_replace("@PORT@",
+ "22",
+ $service_template);
+ $sshservice = str_replace("@TYPE@",
+ "_ssh._tcp",
+ $sshservice);
+ $sshservice = str_replace("@SERVICE_DESC@",
+ "Remote Terminal",
+ $sshservice);
+ $sshservice = str_replace("@TXT_RECORDS@",
+ "",
+ $sshservice);
+
+ file_put_contents("/usr/local/etc/avahi/services/ssh.service", $sshservice);
+
+ /* do the same for sftp, cause we do enable it by dfeault */
+ $sftpservice = str_replace("@PORT@",
+ "22",
+ $service_template);
+ $sftpservice = str_replace("@TYPE@",
+ "_ssh._tcp",
+ $sftpservice);
+ $sftpservice = str_replace("@SERVICE_DESC@",
+ "Remote Terminal",
+ $sftpservice);
+ $sftpservice = str_replace("@TXT_RECORDS@",
+ "",
+ $sftpservice);
+
+ file_put_contents("/usr/local/etc/avahi/services/ssh-sftp.service", $sftpservice);
+ } // end if
+
+ /* we are using wzdftpd, which has the ability to announce itself */
+ if (isset($freenas_config['ftp']['enable'])) {
+ /* NOP */
+ }
+
+ if (isset($freenas_config['samba']['enable'])) {
+ $cifsservice = str_replace("@PORT@",
+ "139",
+ $service_template);
+ $cifsservice = str_replace("@TYPE@",
+ "_smb._tcp",
+ $cifsservice);
+ $cifsservice = str_replace("@SERVICE_DESC@",
+ "Samba Server",
+ $cifsservice);
+ $cifsservice = str_replace("@TXT_RECORDS@",
+ "",
+ $cifsservice);
+
+ file_put_contents("/usr/local/etc/avahi/services/cifs.service", $cifsservice);
+ }
+
+ if (isset($freenas_config['nfs']['enable'])) {
+ /* If no share configured, exit */
+ if (!is_array($freenas_config['mounts']['mount'])) { break; }
+
+ $a_mount = &$freenas_config['mounts']['mount'];
+
+ foreach ($a_mount as $mount) {
+ $sharename = str_replace(" ", "", $mount['sharename']);
+ $sharename = strtolower($sharename);
+
+ $nfsservice = str_replace("@PORT@",
+ "2049",
+ $service_template);
+ $nfsservice = str_replace("@TYPE@",
+ "_nfs._tcp",
+ $nfsservice);
+ $nfsservice = str_replace("@SERVICE_DESC@",
+ "NFS Mount: {$mount['sharename']}",
+ $nfsservice);
+ $nfsservice = str_replace("@TXT_RECORDS@",
+ "path=/mnt/{$mount['sharename']}",
+ $nfsservice);
+
+ file_put_contents("/usr/local/etc/avahi/services/{$sharename}_nfs.service", $nfsservice);
+ } // end foreach
+ } // end if
+
+ /* run dbus */
+ mwexec("/usr/local/bin/dbus-daemon --system");
+ /* run avahi */
+ mwexec("/usr/local/sbin/avahi-daemon -D");
+
+ if ($g['booting']) { echo "done\n"; }
+
+ return 0;
+}
+
+/* this function is currently not used */
+function services_howl_configure() {
+ global $freenas_config, $config, $g;
+
+ /* kill any mDNSResponder */
+ killbyname("mDNSResponder");
+
+ if (isset($config['system']['zeroconf_disable'])) { return 0; }
+
+ $fd = fopen("{$g['varetc_path']}/mDNSResponder.conf", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open mDNSResponder.conf in services_howl_configure().\n");
+ return 1;
+ }
+
+ if ($config['system']['webgui']['port']) {
+ $mDNSResponder = <<<EOD
+"{$config['system']['hostname']} Web Admin" _http._tcp local. {$config['system']['webgui']['port']}
+
+EOD;
+ } else {
+ $mDNSResponder = <<<EOD
+"{$config['system']['hostname']} Web Admin" _http._tcp local. 80
+
+EOD;
+ } // end if
+
+ if (isset($freenas_config['afp']['enable'])) {
+ $mDNSResponder .= <<<EOD
+"{$config['system']['hostname']} AFP Server" _afpovertcp._tcp local. 548
+
+EOD;
+ }
+
+ if (isset($freenas_config['rsyncd']['enable'])) {
+ $mDNSResponder .= <<<EOD
+"{$config['system']['hostname']} RSYNC Server" _rsync._tcp. local. {$freenas_config['rsyncd']['port']}
+
+EOD;
+ }
+
+ if (isset($config['sshd']['enable'])) {
+ $mDNSResponder .= <<<EOD
+"{$config['system']['hostname']} SSH Server" _ssh._tcp local. {$config['sshd']['port']}
+
+EOD;
+ }
+
+ if (isset($freenas_config['ftp']['enable'])) {
+ $mDNSResponder .= <<<EOD
+"{$config['system']['hostname']} FTP Server" _ftp._tcp local. {$freenas_config['ftp']['port']}
+
+EOD;
+ }
+
+ if (isset($freenas_config['samba']['enable'])) {
+ $mDNSResponder .= <<<EOD
+"{$config['system']['hostname']} Samba Server" _smb._tcp local. 139
+
+EOD;
+ }
+
+ if (isset($freenas_config['nfs']['enable'])) {
+ /* If no share configured, exit */
+ if (!is_array($freenas_config['mounts']['mount'])) { break; }
+
+ $a_mount = &$freenas_config['mounts']['mount'];
+
+ foreach ($a_mount as $mount) {
+ $mDNSResponder .= <<<EOD
+"{$config['system']['hostname']} NFS: {$mount['sharename']}" _nfs._tcp local. 2049 path=/mnt/{$mount['sharename']}
+
+EOD;
+ } // end foreach
+ } // end if
+
+ fwrite($fd, $mDNSResponder);
+ fclose($fd);
+
+
+ /* run mDNSResponder */
+ mwexec("/usr/local/sbin/mDNSResponder -f {$g['varetc_path']}/mDNSResponder.conf");
+
+ if ($g['booting']) { echo "done\n"; }
+
+ return 0;
+}
+
+/* this function is currently not used */
+function services_mdnsresponder_configure() {
+ global $freenas_config, $config, $g;
+
+ /* kill any running snmpd */
+ sigkillbypid("{$g['varrun_path']}/mDNSResponder.pid", "TERM");
+
+ if (isset($config['system']['zeroconf_disable'])) { return 0; }
+
+ $fd = fopen("{$g['varetc_path']}/mDNSResponder.conf", "w");
+
+ if (!$fd) {
+ printf("Error: cannot open mDNSResponder.conf in services_bonjour_configure().\n");
+ return 1;
+ }
+
+ if ($config['system']['webgui']['port']) {
+ $mDNSResponder = <<<EOD
+"{$config['system']['hostname']} Web Admin"
+_http._tcp local.
+{$config['system']['webgui']['port']}
+
+EOD;
+ } else {
+ $mDNSResponder = <<<EOD
+"{$config['system']['hostname']} Web Admin"
+_http._tcp local.
+80
+
+EOD;
+ } // end if
+
+ if (isset($freenas_config['afp']['enable'])) {
+ $mDNSResponder .= <<<EOD
+
+"{$config['system']['hostname']} AFP Server"
+_afpovertcp._tcp local.
+548
+
+EOD;
+ }
+
+ if (isset($freenas_config['rsyncd']['enable'])) {
+ $mDNSResponder .= <<<EOD
+
+"{$config['system']['hostname']} RSYNC Server"
+_rsync._tcp. local.
+{$freenas_config['rsyncd']['port']}
+
+EOD;
+ }
+
+ if (isset($config['sshd']['enable'])) {
+ $mDNSResponder .= <<<EOD
+
+"{$freenas_config['system']['hostname']} SSH Server"
+_ssh._tcp local.
+{$config['sshd']['port']}
+
+EOD;
+ }
+
+ if (isset($freenas_config['ftp']['enable'])) {
+ $mDNSResponder .= <<<EOD
+
+"{$config['system']['hostname']} FTP Server"
+_ftp._tcp local.
+{$freenas_config['ftp']['port']}
+
+EOD;
+ }
+
+ if (isset($freenas_config['samba']['enable'])) {
+ $mDNSResponder .= <<<EOD
+
+"{$config['system']['hostname']} Samba Server"
+_smb._tcp local.
+139
+
+EOD;
+ }
+
+ if (isset($freenas_config['nfs']['enable'])) {
+ /* If no share configured, exit */
+ if (!is_array($freenas_config['mounts']['mount'])) { break; }
+
+ $a_mount = &$freenas_config['mounts']['mount'];
+
+ foreach ($a_mount as $mount) {
+ $mDNSResponder .= <<<EOD
+
+"{$config['system']['hostname']} NFS: {$mount['sharename']}"
+_nfs._tcp local.
+2049 path=/mnt/{$mount['sharename']}
+
+EOD;
+ } // end foreach
+ }
+
+ fwrite($fd, $mDNSResponder);
+ fclose($fd);
+
+
+ /* run mDNSResponder */
+ mwexec("/usr/local/sbin/mDNSResponderPosix -b -f {$g['varetc_path']}/mDNSResponder.conf");
+
+ if ($g['booting']) { echo "done\n"; }
+
+ return 0;
+}
+?> \ No newline at end of file