Index: head/net/Makefile =================================================================== --- head/net/Makefile (revision 441116) +++ head/net/Makefile (revision 441117) @@ -1,1464 +1,1465 @@ # $FreeBSD$ # COMMENT = Networking tools SUBDIR += 3proxy SUBDIR += 44bsd-rdist SUBDIR += 6tunnel SUBDIR += GeoIP SUBDIR += R-cran-twitteR SUBDIR += Sockets SUBDIR += abills SUBDIR += activemq SUBDIR += adasockets SUBDIR += afpfs-ng SUBDIR += aget SUBDIR += anet SUBDIR += aoe SUBDIR += apinger SUBDIR += appkonference SUBDIR += aprsc SUBDIR += arp-scan SUBDIR += arp-sk SUBDIR += arpdig SUBDIR += arping SUBDIR += arprelease SUBDIR += asio SUBDIR += aslookup SUBDIR += asterisk-chan_sccp SUBDIR += asterisk-g72x SUBDIR += asterisk11 SUBDIR += asterisk13 SUBDIR += avahi SUBDIR += avahi-app SUBDIR += avahi-autoipd SUBDIR += avahi-gtk SUBDIR += avahi-gtk3 SUBDIR += avahi-header SUBDIR += avahi-libdns SUBDIR += avahi-qt4 SUBDIR += avahi-sharp SUBDIR += axa SUBDIR += babeld SUBDIR += balance SUBDIR += bctoolbox SUBDIR += beacon SUBDIR += beanstalkd SUBDIR += belle-sip SUBDIR += bindtest SUBDIR += binkd SUBDIR += bird SUBDIR += bird-devel SUBDIR += bird6 SUBDIR += bittwist SUBDIR += bluemix-cli SUBDIR += bmon SUBDIR += bnxt-kmod SUBDIR += boclient SUBDIR += boinc-client SUBDIR += boinc_curses SUBDIR += bounce SUBDIR += bsdec2-image-upload SUBDIR += bsdproxy SUBDIR += bwi-firmware-kmod SUBDIR += bwn-firmware-kmod SUBDIR += bwping SUBDIR += c3270 SUBDIR += cagibi SUBDIR += ccxstream SUBDIR += ceph-devel SUBDIR += cf SUBDIR += chrony SUBDIR += citrix_ica SUBDIR += cjdns SUBDIR += cloud-init + SUBDIR += cloud-init-azure SUBDIR += clusterit SUBDIR += cnd SUBDIR += coda6_client SUBDIR += coda6_server SUBDIR += concourse-fly SUBDIR += corkscrew SUBDIR += corosync SUBDIR += courier-authlib-ldap SUBDIR += crtmpserver SUBDIR += cryptcat SUBDIR += csocks SUBDIR += csync2 SUBDIR += ctrace SUBDIR += cvsup-static SUBDIR += cvsync SUBDIR += czmq SUBDIR += daemonlogger SUBDIR += dante SUBDIR += daq SUBDIR += datapipe SUBDIR += dbeacon SUBDIR += delegate SUBDIR += dgd SUBDIR += dgd-kernel SUBDIR += dgd-lpmud SUBDIR += dhcp6 SUBDIR += dhcpcd SUBDIR += dhcpd SUBDIR += dhcpd-pools SUBDIR += dhcpdump SUBDIR += dhcperf SUBDIR += dhcping SUBDIR += dhcprelay SUBDIR += dhcprelya SUBDIR += dictd SUBDIR += dictd-database SUBDIR += dimes SUBDIR += dpdk SUBDIR += dpinger SUBDIR += drawterm SUBDIR += dropbox-api-command SUBDIR += dropbox-uploader SUBDIR += dshell SUBDIR += dtcp SUBDIR += dtcpclient SUBDIR += dual-dhclient SUBDIR += e169-stats SUBDIR += easysoap SUBDIR += echoping SUBDIR += elixir-kafka_ex SUBDIR += elixir-oauth2 SUBDIR += empty SUBDIR += enet SUBDIR += erlang-ranch SUBDIR += erlang-xmlrpc SUBDIR += etrace SUBDIR += exabgp SUBDIR += exaddos SUBDIR += fb SUBDIR += findmtu SUBDIR += flowgrep SUBDIR += fonulator SUBDIR += foreman-proxy SUBDIR += fpc-ldap SUBDIR += fpc-pcap SUBDIR += fping SUBDIR += freebsd-tftp SUBDIR += freebsd-uucp SUBDIR += freediameter SUBDIR += freenet6 SUBDIR += freeradius-client SUBDIR += freeradius2 SUBDIR += freeradius3 SUBDIR += freerdp SUBDIR += freerdp1 SUBDIR += freeswitch SUBDIR += freevrrpd SUBDIR += fspclient SUBDIR += fspd SUBDIR += fsplib SUBDIR += g2ipmsg SUBDIR += gdrive SUBDIR += geoclue SUBDIR += geocode-glib SUBDIR += geoipupdate SUBDIR += get_iplayer SUBDIR += gfbgraph SUBDIR += gini SUBDIR += gkrellmwireless2 SUBDIR += glflow SUBDIR += glib-networking SUBDIR += glusterfs SUBDIR += gnatsd SUBDIR += gnet2 SUBDIR += gnetcat SUBDIR += gnome-nettool SUBDIR += gnome-online-accounts SUBDIR += gnome-online-miners SUBDIR += gnu-dico SUBDIR += gnu-radius SUBDIR += go-amqp SUBDIR += go-bapu SUBDIR += go-cs SUBDIR += go-geoip SUBDIR += go-httppath SUBDIR += go-httptreemux SUBDIR += go-nats SUBDIR += go.net SUBDIR += gofish SUBDIR += gogoc SUBDIR += google-cloud-sdk SUBDIR += google-daemon SUBDIR += google-startup-scripts SUBDIR += googlecl SUBDIR += gopher SUBDIR += gotthard SUBDIR += gq SUBDIR += grdesktop SUBDIR += grilo SUBDIR += grilo-plugins SUBDIR += grive SUBDIR += grive2 SUBDIR += grsync SUBDIR += gsk SUBDIR += gspoof SUBDIR += gssdp SUBDIR += gstreamer-plugins-libmms SUBDIR += gstreamer1-plugins-libmms SUBDIR += gtic SUBDIR += gtk-vnc SUBDIR += gtknetcat SUBDIR += guacamole-server SUBDIR += gupnp SUBDIR += gupnp-av SUBDIR += gupnp-dlna SUBDIR += gupnp-igd SUBDIR += gupnp-ui SUBDIR += gutenfetch SUBDIR += gwhois SUBDIR += h323plus SUBDIR += hanstunnel SUBDIR += haproxy SUBDIR += haproxy-devel SUBDIR += hexinject SUBDIR += hidentd SUBDIR += hinfo SUBDIR += hlmaster SUBDIR += honeyd SUBDIR += hostapd SUBDIR += howl SUBDIR += hping SUBDIR += hping-devel SUBDIR += hs-aws SUBDIR += hs-connection SUBDIR += hs-gsasl SUBDIR += hs-hoauth2 SUBDIR += hs-hostname SUBDIR += hs-iproute SUBDIR += hs-maccatcher SUBDIR += hs-network SUBDIR += hs-network-info SUBDIR += hs-network-multicast SUBDIR += hs-network-protocol-xmpp SUBDIR += hs-network-uri SUBDIR += hs-pcap SUBDIR += hs-publicsuffixlist SUBDIR += hs-sendfile SUBDIR += hs-simple-sendfile SUBDIR += hs-socks SUBDIR += hsflowd SUBDIR += htpdate SUBDIR += http_ping SUBDIR += httping SUBDIR += httpry SUBDIR += hupnp SUBDIR += iaxmodem SUBDIR += icmpinfo SUBDIR += icpld SUBDIR += ifdepd SUBDIR += iffinder SUBDIR += ifstat SUBDIR += ifstated SUBDIR += igmpproxy SUBDIR += iipsrv SUBDIR += ilbc SUBDIR += imapproxy SUBDIR += intel-em-kmod SUBDIR += intel-ixl-kmod SUBDIR += iodine SUBDIR += ip2location SUBDIR += ip6_int SUBDIR += ipdecap SUBDIR += ipgrab SUBDIR += iplog SUBDIR += ipsorc SUBDIR += ipsumdump SUBDIR += ipsvd SUBDIR += ipxe SUBDIR += irrd SUBDIR += isboot-kmod SUBDIR += isc-dhcp43-client SUBDIR += isc-dhcp43-relay SUBDIR += isc-dhcp43-server SUBDIR += istgt SUBDIR += jags SUBDIR += jakarta-commons-net SUBDIR += java-beepcore SUBDIR += jcifs SUBDIR += jgroups SUBDIR += jicmp SUBDIR += jicmp6 SUBDIR += jrdesktop SUBDIR += jsch SUBDIR += jumpgate SUBDIR += jwhois SUBDIR += kafkacat SUBDIR += kamailio SUBDIR += kdenetwork4 SUBDIR += kdenetwork4-filesharing SUBDIR += kdenetwork4-strigi-analyzers SUBDIR += kea SUBDIR += kf5-kxmlrpcclient SUBDIR += kget SUBDIR += kio-upnp-ms SUBDIR += kippo SUBDIR += kissd SUBDIR += knc SUBDIR += knemo-kde4 SUBDIR += krdc SUBDIR += krfb SUBDIR += kwooty SUBDIR += l2tpd SUBDIR += l4ip SUBDIR += ladvd SUBDIR += lambdamoo SUBDIR += latd SUBDIR += ldap-stats SUBDIR += ldap2dns SUBDIR += ldapbrowser SUBDIR += ldapdiff SUBDIR += ldapscripts SUBDIR += ldapsdk SUBDIR += ldapsh SUBDIR += lft SUBDIR += libarms SUBDIR += libbgpdump SUBDIR += libcapn SUBDIR += libcmis SUBDIR += libdmapsharing SUBDIR += libdnet SUBDIR += libexosip2 SUBDIR += libfb SUBDIR += libfixbuf SUBDIR += libgnetwork SUBDIR += libgweather SUBDIR += libilbc SUBDIR += libkfbapi SUBDIR += libkvkontakte SUBDIR += libmaia SUBDIR += libmateweather SUBDIR += libmaxminddb SUBDIR += libmediawiki SUBDIR += libmms SUBDIR += libmxp SUBDIR += libnatpmp SUBDIR += libnet SUBDIR += libnetdude SUBDIR += libnfs SUBDIR += libnids SUBDIR += libnss-cache SUBDIR += libnss-mysql SUBDIR += libnss-pgsql SUBDIR += liboauth SUBDIR += libopennet SUBDIR += liboping SUBDIR += libosip2 SUBDIR += libp0f SUBDIR += libpcap SUBDIR += libpcapnav SUBDIR += libproxy SUBDIR += libproxy-gnome SUBDIR += libproxy-gnome3 SUBDIR += libproxy-kde SUBDIR += libproxy-mozjs SUBDIR += libproxy-perl SUBDIR += libproxy-python SUBDIR += libproxy-webkit SUBDIR += librdkafka SUBDIR += librouteros SUBDIR += librsync2 SUBDIR += libsocket++ SUBDIR += libsocketcpp SUBDIR += libsrtp SUBDIR += libtnl SUBDIR += libtrace SUBDIR += libunp SUBDIR += libutp SUBDIR += libvncserver SUBDIR += libwebsockets SUBDIR += libzapojit SUBDIR += libzmq2 SUBDIR += libzmq3 SUBDIR += libzmq4 SUBDIR += liferea SUBDIR += linknx SUBDIR += linphone SUBDIR += linux-c6-avahi-libs SUBDIR += linux-c6-openldap SUBDIR += linux-c6-tcp_wrappers-libs SUBDIR += linux-c7-avahi-libs SUBDIR += linux-c7-openldap SUBDIR += linux-c7-tcp_wrappers-libs SUBDIR += linuxigd SUBDIR += liveMedia SUBDIR += lla SUBDIR += ltm SUBDIR += lualdap SUBDIR += luasocket SUBDIR += luasocket-51 SUBDIR += lvwimax SUBDIR += mDNSResponder SUBDIR += macchanger SUBDIR += mad_fcl SUBDIR += malo-firmware-kmod SUBDIR += mdns-repeater SUBDIR += mediastreamer SUBDIR += mediatomb SUBDIR += megatools SUBDIR += mgen SUBDIR += micro_inetd SUBDIR += micro_proxy SUBDIR += minidlna SUBDIR += minisapserver SUBDIR += minissdpd SUBDIR += miniupnpc SUBDIR += miniupnpd SUBDIR += miredo SUBDIR += miruo SUBDIR += mlvpn SUBDIR += mobile-broadband-provider-info SUBDIR += mono-zeroconf SUBDIR += mopd SUBDIR += morebalance SUBDIR += mosh SUBDIR += mosquitto SUBDIR += motsognir SUBDIR += mpd-l2tp-ipv6pd-client SUBDIR += mpd5 SUBDIR += mpich SUBDIR += mpich2 SUBDIR += mping SUBDIR += mrouted SUBDIR += msend SUBDIR += mtr SUBDIR += mtr-nox11 SUBDIR += multicat SUBDIR += nakenchat SUBDIR += nanomsg SUBDIR += nast SUBDIR += nats-streaming-server SUBDIR += nats-top SUBDIR += nbd-server SUBDIR += nc SUBDIR += ncp SUBDIR += ndisc6 SUBDIR += ndpi SUBDIR += nepenthes SUBDIR += nepim SUBDIR += net6 SUBDIR += netatalk SUBDIR += netatalk3 SUBDIR += netcat SUBDIR += netdude SUBDIR += netembryo SUBDIR += nethogs SUBDIR += netmap SUBDIR += netpipes SUBDIR += netscript SUBDIR += netsed SUBDIR += netselect SUBDIR += netstrain SUBDIR += nettest SUBDIR += netwib SUBDIR += neubot SUBDIR += nfsshell SUBDIR += ng_mikrotik_eoip SUBDIR += ngrep SUBDIR += nifmon SUBDIR += nload SUBDIR += nmsg SUBDIR += nocatsplash SUBDIR += norm SUBDIR += nph SUBDIR += ns3 SUBDIR += nsq SUBDIR += nss-pam-ldapd SUBDIR += nss-pam-ldapd-sasl SUBDIR += nss_ldap SUBDIR += nsscache SUBDIR += ntimed SUBDIR += ntlmaps SUBDIR += ntop SUBDIR += ntopng SUBDIR += ntp SUBDIR += ntp-devel SUBDIR += ntpa SUBDIR += ntraceroute SUBDIR += nusoap SUBDIR += nxproxy SUBDIR += nyancat SUBDIR += nylon SUBDIR += ocserv SUBDIR += ohphone SUBDIR += olsrd SUBDIR += omnitty SUBDIR += onenetd SUBDIR += onioncat SUBDIR += opal SUBDIR += open-isns SUBDIR += openafs SUBDIR += openbgpd SUBDIR += openbsc SUBDIR += openggsn SUBDIR += openh323 SUBDIR += openldap24-client SUBDIR += openldap24-sasl-client SUBDIR += openldap24-server SUBDIR += openmpi SUBDIR += openmpi2 SUBDIR += openmq SUBDIR += openmq-client SUBDIR += openntpd SUBDIR += opennx SUBDIR += openpgm SUBDIR += openradius SUBDIR += opensips SUBDIR += openslp SUBDIR += opentracker SUBDIR += openvswitch SUBDIR += ortp SUBDIR += osrtspproxy SUBDIR += ossp-sa SUBDIR += ostinato SUBDIR += owamp SUBDIR += p5-Acme-HTTP SUBDIR += p5-AddressBook SUBDIR += p5-Amazon-SQS-Simple SUBDIR += p5-AnyEvent-MPRPC SUBDIR += p5-AnyEvent-MQTT SUBDIR += p5-AnyEvent-RabbitMQ SUBDIR += p5-AnyEvent-Twitter SUBDIR += p5-AnyEvent-Twitter-Stream SUBDIR += p5-AnyMQ-AMQP SUBDIR += p5-Apache2-SOAP SUBDIR += p5-BBS-Client SUBDIR += p5-BBS-UserInfo SUBDIR += p5-BBS-UserInfo-Maple3 SUBDIR += p5-BBS-UserInfo-Maple3itoc SUBDIR += p5-BBS-UserInfo-Ptt SUBDIR += p5-BBS-UserInfo-SOB SUBDIR += p5-BBS-UserInfo-Wretch SUBDIR += p5-Beanstalk-Client SUBDIR += p5-Cisco-IPPhone SUBDIR += p5-Crypt-DH-GMP SUBDIR += p5-Daemon-Generic SUBDIR += p5-Data-IPV4-Range-Parse SUBDIR += p5-EasyTCP SUBDIR += p5-Event-tcp SUBDIR += p5-File-Rsync SUBDIR += p5-File-RsyncP SUBDIR += p5-Filesys-SmbClient SUBDIR += p5-Frontier-RPC SUBDIR += p5-Geo-IP SUBDIR += p5-Geo-IP-PurePerl SUBDIR += p5-Geo-IPfree SUBDIR += p5-GeoIP2 SUBDIR += p5-Google-SAML-Request SUBDIR += p5-Google-SAML-Response SUBDIR += p5-Growl-GNTP SUBDIR += p5-IO-Interface SUBDIR += p5-IO-Socket-INET6 SUBDIR += p5-IO-Socket-IP SUBDIR += p5-IO-Socket-Multicast SUBDIR += p5-IO-Socket-Multicast6 SUBDIR += p5-IO-Socket-Socks SUBDIR += p5-IO-Socket-Timeout SUBDIR += p5-IO-Socket-UNIX-Util SUBDIR += p5-IP-Anonymous SUBDIR += p5-IP-Country SUBDIR += p5-IPC-Session SUBDIR += p5-JavaScript-RPC SUBDIR += p5-Kafka SUBDIR += p5-MaxMind-DB-Common SUBDIR += p5-MaxMind-DB-Reader SUBDIR += p5-MaxMind-DB-Writer SUBDIR += p5-Net SUBDIR += p5-Net-AMQP SUBDIR += p5-Net-AMQP-RabbitMQ SUBDIR += p5-Net-APNS SUBDIR += p5-Net-APNs-Extended SUBDIR += p5-Net-ARP SUBDIR += p5-Net-Address-Ethernet SUBDIR += p5-Net-Address-IPv4-Local SUBDIR += p5-Net-Amazon SUBDIR += p5-Net-Amazon-AWSSign SUBDIR += p5-Net-Amazon-EC2 SUBDIR += p5-Net-Amazon-MechanicalTurk SUBDIR += p5-Net-Amazon-S3 SUBDIR += p5-Net-Amazon-Signature SUBDIR += p5-Net-Amazon-Signature-V3 SUBDIR += p5-Net-Amazon-Signature-V4 SUBDIR += p5-Net-Amazon-Thumbnail SUBDIR += p5-Net-Analysis SUBDIR += p5-Net-Appliance-Phrasebook SUBDIR += p5-Net-Appliance-Session SUBDIR += p5-Net-BGP SUBDIR += p5-Net-Blogger SUBDIR += p5-Net-CIDR-Lite SUBDIR += p5-Net-CIDR-MobileJP SUBDIR += p5-Net-CIDR-Set SUBDIR += p5-Net-CLI-Interact SUBDIR += p5-Net-CSTA SUBDIR += p5-Net-CascadeCopy SUBDIR += p5-Net-Cassandra SUBDIR += p5-Net-Cassandra-Easy SUBDIR += p5-Net-DAV-Server SUBDIR += p5-Net-DHCP SUBDIR += p5-Net-DHCP-Watch SUBDIR += p5-Net-DHCPClient SUBDIR += p5-Net-DLookup SUBDIR += p5-Net-Daemon SUBDIR += p5-Net-Delicious SUBDIR += p5-Net-Dict SUBDIR += p5-Net-Divert SUBDIR += p5-Net-Dropbox-API SUBDIR += p5-Net-EPP SUBDIR += p5-Net-EPP-Proxy SUBDIR += p5-Net-FS-Flickr SUBDIR += p5-Net-FS-Gmail SUBDIR += p5-Net-FTP-AutoReconnect SUBDIR += p5-Net-FTP-File SUBDIR += p5-Net-Finger SUBDIR += p5-Net-Flow SUBDIR += p5-Net-Frame SUBDIR += p5-Net-Frame-Device SUBDIR += p5-Net-Frame-Dump SUBDIR += p5-Net-Frame-Layer-ICMPv6 SUBDIR += p5-Net-Frame-Layer-IPv6 SUBDIR += p5-Net-Frame-Simple SUBDIR += p5-Net-GitHub SUBDIR += p5-Net-Gnats SUBDIR += p5-Net-Google SUBDIR += p5-Net-Google-Analytics SUBDIR += p5-Net-Google-AuthSub SUBDIR += p5-Net-Google-Calendar SUBDIR += p5-Net-Google-Code SUBDIR += p5-Net-Google-DataAPI SUBDIR += p5-Net-Google-PicasaWeb SUBDIR += p5-Net-Google-SafeBrowsing2 SUBDIR += p5-Net-Google-Spreadsheets SUBDIR += p5-Net-Growl SUBDIR += p5-Net-GrowlClient SUBDIR += p5-Net-HL7 SUBDIR += p5-Net-HTTP SUBDIR += p5-Net-HTTP-Spore SUBDIR += p5-Net-HTTP-Spore-Middleware-Header SUBDIR += p5-Net-HTTPS-Any SUBDIR += p5-Net-HTTPS-NB SUBDIR += p5-Net-Hiveminder SUBDIR += p5-Net-INET6Glue SUBDIR += p5-Net-IP-Minimal SUBDIR += p5-Net-IP-RangeCompare SUBDIR += p5-Net-IPTrie SUBDIR += p5-Net-IRR SUBDIR += p5-Net-Ident SUBDIR += p5-Net-Ifconfig-Wrapper SUBDIR += p5-Net-Interface SUBDIR += p5-Net-Jaiku SUBDIR += p5-Net-Jifty SUBDIR += p5-Net-LDAP-AutoDNs SUBDIR += p5-Net-LDAP-AutoServer SUBDIR += p5-Net-LDAP-Express SUBDIR += p5-Net-LDAP-FilterBuilder SUBDIR += p5-Net-LDAP-LDAPhash SUBDIR += p5-Net-LDAP-Makepath SUBDIR += p5-Net-LDAP-Server SUBDIR += p5-Net-LDAP-Server-Test SUBDIR += p5-Net-LDAP-posixAccount SUBDIR += p5-Net-LDAP-posixGroup SUBDIR += p5-Net-Libdnet SUBDIR += p5-Net-Libdnet6 SUBDIR += p5-Net-LimeLight-Purge SUBDIR += p5-Net-MAC SUBDIR += p5-Net-MAC-Vendor SUBDIR += p5-Net-MQTT SUBDIR += p5-Net-Mosso-CloudFiles SUBDIR += p5-Net-MovableType SUBDIR += p5-Net-NBName SUBDIR += p5-Net-NBsocket SUBDIR += p5-Net-NIS SUBDIR += p5-Net-NIS-Listgroup SUBDIR += p5-Net-NTP SUBDIR += p5-Net-Nessus-XMLRPC SUBDIR += p5-Net-Nmsg SUBDIR += p5-Net-OAuth SUBDIR += p5-Net-OAuth-Simple SUBDIR += p5-Net-OAuth2 SUBDIR += p5-Net-OpenID-Consumer SUBDIR += p5-Net-OpenSSH SUBDIR += p5-Net-OpenSSH-Parallel SUBDIR += p5-Net-OpenStack-Attack SUBDIR += p5-Net-Packet SUBDIR += p5-Net-Packet-Target SUBDIR += p5-Net-ParseWhois SUBDIR += p5-Net-Patricia SUBDIR += p5-Net-Pcap SUBDIR += p5-Net-PcapUtils SUBDIR += p5-Net-Ping-External SUBDIR += p5-Net-Proxy SUBDIR += p5-Net-PubSubHubbub-Publisher SUBDIR += p5-Net-RTP SUBDIR += p5-Net-RabbitFoot SUBDIR += p5-Net-RabbitMQ SUBDIR += p5-Net-Radius SUBDIR += p5-Net-Random SUBDIR += p5-Net-RawIP SUBDIR += p5-Net-RawSock SUBDIR += p5-Net-Rendezvous-Publish SUBDIR += p5-Net-Riak SUBDIR += p5-Net-Rsh SUBDIR += p5-Net-SAP SUBDIR += p5-Net-SCP SUBDIR += p5-Net-SCP-Expect SUBDIR += p5-Net-SDP SUBDIR += p5-Net-SFTP SUBDIR += p5-Net-SFTP-Foreign SUBDIR += p5-Net-SIP SUBDIR += p5-Net-SMPP SUBDIR += p5-Net-SMS-Clickatell SUBDIR += p5-Net-SMS-Mollie SUBDIR += p5-Net-SMS-PChome SUBDIR += p5-Net-SNPP SUBDIR += p5-Net-SPDY SUBDIR += p5-Net-SSH SUBDIR += p5-Net-SSH-Expect SUBDIR += p5-Net-SSH-Mechanize SUBDIR += p5-Net-SSH-Perl SUBDIR += p5-Net-SSH2 SUBDIR += p5-Net-STOMP-Client SUBDIR += p5-Net-Server SUBDIR += p5-Net-Server-Coro SUBDIR += p5-Net-Server-SS-PreFork SUBDIR += p5-Net-Subnet SUBDIR += p5-Net-Syslog SUBDIR += p5-Net-TCLink SUBDIR += p5-Net-TacacsPlus SUBDIR += p5-Net-TcpDumpLog SUBDIR += p5-Net-Telnet SUBDIR += p5-Net-Telnet-Netscreen SUBDIR += p5-Net-TiVo SUBDIR += p5-Net-Todoist SUBDIR += p5-Net-Traceroute SUBDIR += p5-Net-Traceroute-PurePerl SUBDIR += p5-Net-Traceroute6 SUBDIR += p5-Net-Trackback SUBDIR += p5-Net-Twitter SUBDIR += p5-Net-Twitter-Lite SUBDIR += p5-Net-VNC SUBDIR += p5-Net-Wake SUBDIR += p5-Net-WhitePages SUBDIR += p5-Net-Whois SUBDIR += p5-Net-Whois-ARIN SUBDIR += p5-Net-Whois-IP SUBDIR += p5-Net-Whois-RIPE SUBDIR += p5-Net-Whois-Raw SUBDIR += p5-Net-Works SUBDIR += p5-Net-Write SUBDIR += p5-Net-XWhois SUBDIR += p5-Net-Yadis SUBDIR += p5-Net-Z3950-SimpleServer SUBDIR += p5-Net-Z3950-ZOOM SUBDIR += p5-Net-ext SUBDIR += p5-Net-sFlow SUBDIR += p5-Net-uFTP SUBDIR += p5-NetAddr-IP-Count SUBDIR += p5-NetAddr-MAC SUBDIR += p5-NetPacket SUBDIR += p5-OAI-Harvester SUBDIR += p5-OurNet-BBS SUBDIR += p5-OurNet-BBSAgent SUBDIR += p5-POE-Component-Client-Ident SUBDIR += p5-POE-Component-Client-Keepalive SUBDIR += p5-POE-Component-Client-Ping SUBDIR += p5-POE-Component-Client-Telnet SUBDIR += p5-POE-Component-Client-Traceroute SUBDIR += p5-POE-Component-Client-Twitter SUBDIR += p5-POE-Component-Client-Whois SUBDIR += p5-POE-Component-ControlPort SUBDIR += p5-POE-Component-Generic SUBDIR += p5-POE-Component-Jabber SUBDIR += p5-POE-Component-Pcap SUBDIR += p5-POE-Component-PubSub SUBDIR += p5-POE-Component-Server-Twirc SUBDIR += p5-POEx-Role-TCPServer SUBDIR += p5-POSIX-Socket SUBDIR += p5-POSIX-getpeername SUBDIR += p5-Parallel-Pvm SUBDIR += p5-Phone-Info SUBDIR += p5-PlRPC SUBDIR += p5-Queue-Beanstalk SUBDIR += p5-REST-Application SUBDIR += p5-REST-Google SUBDIR += p5-RPC-EPC-Service SUBDIR += p5-RPC-Simple SUBDIR += p5-RPC-XML SUBDIR += p5-ResourcePool-Resource-Net-LDAP SUBDIR += p5-ResourcePool-Resource-SOAP-Lite SUBDIR += p5-Rose-URI SUBDIR += p5-S3 SUBDIR += p5-SOAP SUBDIR += p5-SOAP-Amazon-S3 SUBDIR += p5-SOAP-Data-Builder SUBDIR += p5-SOAP-Lite SUBDIR += p5-SOAP-MySOAP SUBDIR += p5-SOAP-XML-Client SUBDIR += p5-Samba-LDAP SUBDIR += p5-Server-Starter SUBDIR += p5-Socket SUBDIR += p5-Socket-Class SUBDIR += p5-Socket-GetAddrInfo SUBDIR += p5-Socket-Multicast6 SUBDIR += p5-Socket6 SUBDIR += p5-Socks SUBDIR += p5-Sort-Key-IPv4 SUBDIR += p5-TFTP SUBDIR += p5-Test-URI SUBDIR += p5-URI SUBDIR += p5-URI-FromHash SUBDIR += p5-URI-Match SUBDIR += p5-URI-Nested SUBDIR += p5-URI-OpenURL SUBDIR += p5-URI-Query SUBDIR += p5-URI-SmartURI SUBDIR += p5-URI-Template SUBDIR += p5-URI-Template-Restrict SUBDIR += p5-URI-db SUBDIR += p5-URI-ws SUBDIR += p5-VM-EC2 SUBDIR += p5-VM-EC2-Security-CredentialCache SUBDIR += p5-Validate-Net SUBDIR += p5-WebService-Dropbox SUBDIR += p5-WebService-Prowl SUBDIR += p5-What SUBDIR += p5-X500-DN SUBDIR += p5-XML-Compile-SOAP SUBDIR += p5-XML-Compile-SOAP-AnyEvent SUBDIR += p5-XML-Compile-SOAP-Daemon SUBDIR += p5-XML-Compile-SOAP-WSA SUBDIR += p5-XML-Compile-WSDL11 SUBDIR += p5-XML-Fast SUBDIR += p5-XML-RPC SUBDIR += p5-XML-RPC-Fast SUBDIR += p5-XMLRPC-Lite SUBDIR += p5-XPC SUBDIR += p5-ZConf SUBDIR += p5-ZConf-Bookmarks SUBDIR += p5-ZeroMQ SUBDIR += p5-ldap2pf SUBDIR += p5-ldap2pw SUBDIR += p5-perl-ldap SUBDIR += p5-srv2pf SUBDIR += pacemaker SUBDIR += packetdrill SUBDIR += packter-agent SUBDIR += panoptis SUBDIR += paris-traceroute SUBDIR += passlogd SUBDIR += pathneck SUBDIR += pbnc SUBDIR += pdb SUBDIR += pear-Auth_RADIUS SUBDIR += pear-File_Bittorrent2 SUBDIR += pear-Horde_Kolab_Server SUBDIR += pear-Horde_Kolab_Session SUBDIR += pear-Horde_Ldap SUBDIR += pear-Horde_Rpc SUBDIR += pear-Horde_Scribe SUBDIR += pear-Horde_Socket_Client SUBDIR += pear-Horde_Url SUBDIR += pear-Net_CDDB SUBDIR += pear-Net_CheckIP SUBDIR += pear-Net_DIME SUBDIR += pear-Net_DNSBL SUBDIR += pear-Net_Dict SUBDIR += pear-Net_Finger SUBDIR += pear-Net_Geo SUBDIR += pear-Net_GeoIP SUBDIR += pear-Net_Growl SUBDIR += pear-Net_IDNA SUBDIR += pear-Net_IPv4 SUBDIR += pear-Net_IPv6 SUBDIR += pear-Net_Ident SUBDIR += pear-Net_LDAP SUBDIR += pear-Net_LDAP2 SUBDIR += pear-Net_MAC SUBDIR += pear-Net_NNTP SUBDIR += pear-Net_Nmap SUBDIR += pear-Net_POP3 SUBDIR += pear-Net_Ping SUBDIR += pear-Net_SMS SUBDIR += pear-Net_SMTP SUBDIR += pear-Net_Server SUBDIR += pear-Net_Sieve SUBDIR += pear-Net_Socket SUBDIR += pear-Net_Traceroute SUBDIR += pear-Net_URL SUBDIR += pear-Net_URL2 SUBDIR += pear-Net_URL_Mapper SUBDIR += pear-Net_UserAgent_Detect SUBDIR += pear-Net_UserAgent_Mobile SUBDIR += pear-Net_Vpopmaild SUBDIR += pear-Net_Whois SUBDIR += pear-SOAP SUBDIR += pear-Services_Pingback SUBDIR += pear-Services_Twitter SUBDIR += pear-URI_Template SUBDIR += pear-XML_RPC SUBDIR += pear-XML_RPC2 SUBDIR += pecl-amqp SUBDIR += pecl-apn SUBDIR += pecl-geoip SUBDIR += pecl-gupnp SUBDIR += pecl-ip2location SUBDIR += pecl-mosquitto SUBDIR += pecl-oauth SUBDIR += pecl-oauth2 SUBDIR += pecl-radius SUBDIR += pecl-smbclient SUBDIR += pecl-yaz SUBDIR += pecl-yp SUBDIR += pecl-zmq SUBDIR += pen SUBDIR += pfinger SUBDIR += phamm SUBDIR += php56-ldap SUBDIR += php56-soap SUBDIR += php56-sockets SUBDIR += php56-xmlrpc SUBDIR += php70-ldap SUBDIR += php70-soap SUBDIR += php70-sockets SUBDIR += php70-xmlrpc SUBDIR += php71-ldap SUBDIR += php71-soap SUBDIR += php71-sockets SUBDIR += php71-xmlrpc SUBDIR += phpldapadmin SUBDIR += pim6-tools SUBDIR += pim6dd SUBDIR += pim6sd SUBDIR += pimd SUBDIR += pimdd SUBDIR += pipsecd SUBDIR += pjsip SUBDIR += pjsip-extsrtp SUBDIR += pktanon SUBDIR += pload SUBDIR += plugdaemon SUBDIR += pmf SUBDIR += polyorb SUBDIR += poptop SUBDIR += portfwd SUBDIR += pptpclient SUBDIR += proftpd-mod_ldap SUBDIR += prosearch SUBDIR += proxy-connect SUBDIR += proxy-suite SUBDIR += proxychains SUBDIR += proxychains-ng SUBDIR += prtunnel SUBDIR += ptpd2 SUBDIR += ptunnel SUBDIR += pure-sockets SUBDIR += pvm SUBDIR += pwhois SUBDIR += pxe SUBDIR += pxe-pdhcp SUBDIR += py-GeoIP SUBDIR += py-GeoIP2 SUBDIR += py-amqp SUBDIR += py-amqplib SUBDIR += py-avahi SUBDIR += py-beanstalkc SUBDIR += py-cjdns SUBDIR += py-cloudfiles SUBDIR += py-coherence SUBDIR += py-cymruwhois SUBDIR += py-dpkt SUBDIR += py-dugong SUBDIR += py-ec2-cli-tools SUBDIR += py-eventlet SUBDIR += py-gntp SUBDIR += py-gspread SUBDIR += py-gspreadsheet SUBDIR += py-haproxy-log-analysis SUBDIR += py-httpstat SUBDIR += py-impacket SUBDIR += py-ipaddress SUBDIR += py-iplib SUBDIR += py-kafka-python SUBDIR += py-kombu SUBDIR += py-ldap SUBDIR += py-ldap3 SUBDIR += py-ldaptor SUBDIR += py-libcloud SUBDIR += py-libdnet SUBDIR += py-libnet SUBDIR += py-magic-wormhole SUBDIR += py-matrix-synapse-ldap3 SUBDIR += py-maxminddb SUBDIR += py-miniupnpc SUBDIR += py-msrplib SUBDIR += py-ndg_httpsclient SUBDIR += py-netaddr SUBDIR += py-netif SUBDIR += py-netifaces SUBDIR += py-netlib SUBDIR += py-netstring SUBDIR += py-nnpy SUBDIR += py-ntplib SUBDIR += py-oauth SUBDIR += py-oauth2 SUBDIR += py-paho-mqtt SUBDIR += py-pamqp SUBDIR += py-pcap SUBDIR += py-pcapy SUBDIR += py-pcs SUBDIR += py-port-for SUBDIR += py-pygeoip SUBDIR += py-pyldap SUBDIR += py-pynmsg SUBDIR += py-pynsq SUBDIR += py-pypcap SUBDIR += py-pysendfile SUBDIR += py-pyshark SUBDIR += py-pysmb SUBDIR += py-pysocks SUBDIR += py-pystun SUBDIR += py-python-barbicanclient SUBDIR += py-python-bitcoinrpc SUBDIR += py-python-ceilometerclient SUBDIR += py-python-cinderclient SUBDIR += py-python-designateclient SUBDIR += py-python-glanceclient SUBDIR += py-python-heatclient SUBDIR += py-python-keystoneclient SUBDIR += py-python-neutronclient SUBDIR += py-python-novaclient SUBDIR += py-python-ntlm SUBDIR += py-python-openstackclient SUBDIR += py-python-twitter SUBDIR += py-pyvmomi SUBDIR += py-pyzmq SUBDIR += py-qt4-network SUBDIR += py-qt5-network SUBDIR += py-rabbitpy SUBDIR += py-radix SUBDIR += py-raet SUBDIR += py-rainbowstream SUBDIR += py-ripe.atlas.cousteau SUBDIR += py-ripe.atlas.sagan SUBDIR += py-ripe.atlas.tools SUBDIR += py-s3cmd SUBDIR += py-s3transfer SUBDIR += py-smbpasswd SUBDIR += py-soap2py SUBDIR += py-soappy SUBDIR += py-socketio-client SUBDIR += py-speedtest-cli SUBDIR += py-sshuttle SUBDIR += py-stomp.py SUBDIR += py-suds SUBDIR += py-suds-jurko SUBDIR += py-terminado SUBDIR += py-tofu SUBDIR += py-tweepy SUBDIR += py-twistedPair SUBDIR += py-twitter-tools SUBDIR += py-txamqp SUBDIR += py-txrestapi SUBDIR += py-upnp-inspector SUBDIR += py-uritemplate SUBDIR += py-urllib3 SUBDIR += py-wolframalpha SUBDIR += py-xmlrpc SUBDIR += py-zope.proxy SUBDIR += py-zsi SUBDIR += py3-netifaces SUBDIR += pygopherd SUBDIR += pynids SUBDIR += pyrad SUBDIR += pythondirector SUBDIR += qadsl SUBDIR += qjsonrpc SUBDIR += qoauth SUBDIR += qoauth-qt5 SUBDIR += qt4-network SUBDIR += qt5-network SUBDIR += qtweetlib SUBDIR += quagga SUBDIR += queso SUBDIR += quiterss SUBDIR += quoted SUBDIR += rabbitmq SUBDIR += rabbitmq-c SUBDIR += rabbitmq-c-devel SUBDIR += raddump SUBDIR += radiator SUBDIR += radiusclient SUBDIR += radiusd-cistron SUBDIR += radreport SUBDIR += radsecproxy SUBDIR += radvd SUBDIR += raggle SUBDIR += rclone SUBDIR += rdapper SUBDIR += rdesktop SUBDIR += rdist6 SUBDIR += recvnet SUBDIR += redir SUBDIR += relayd SUBDIR += remmina SUBDIR += remmina-plugin-gnome SUBDIR += remmina-plugin-nx SUBDIR += remmina-plugin-rdp SUBDIR += remmina-plugin-telepathy SUBDIR += remmina-plugin-vnc SUBDIR += remmina-plugin-xdmcp SUBDIR += remmina-plugins SUBDIR += remotebox SUBDIR += remotedesk SUBDIR += repeater SUBDIR += reposado SUBDIR += rfbproxy SUBDIR += rinetd SUBDIR += ripe-whois SUBDIR += rp-pppoe SUBDIR += rsplib SUBDIR += rsync SUBDIR += rsync-bpc SUBDIR += rtg SUBDIR += rtpbreak SUBDIR += rtpproxy SUBDIR += rtptools SUBDIR += rubygem-amazon-ec2 SUBDIR += rubygem-amq-protocol SUBDIR += rubygem-amqp SUBDIR += rubygem-amqp-utils SUBDIR += rubygem-aws-s3 SUBDIR += rubygem-aws-ses SUBDIR += rubygem-azure SUBDIR += rubygem-azure-core SUBDIR += rubygem-bunny SUBDIR += rubygem-connection_pool SUBDIR += rubygem-dogapi SUBDIR += rubygem-domain_name SUBDIR += rubygem-dropbox-sdk SUBDIR += rubygem-epp-client-afnic SUBDIR += rubygem-epp-client-base SUBDIR += rubygem-epp-client-rgp SUBDIR += rubygem-epp-client-secdns SUBDIR += rubygem-epp-client-smallregistry SUBDIR += rubygem-fog-aliyun SUBDIR += rubygem-fog-atmos SUBDIR += rubygem-fog-aws SUBDIR += rubygem-fog-aws0 SUBDIR += rubygem-fog-azure SUBDIR += rubygem-fog-brightbox SUBDIR += rubygem-fog-cloudatcost SUBDIR += rubygem-fog-digitalocean SUBDIR += rubygem-fog-dnsimple SUBDIR += rubygem-fog-dynect SUBDIR += rubygem-fog-ecloud SUBDIR += rubygem-fog-google SUBDIR += rubygem-fog-local SUBDIR += rubygem-fog-openstack SUBDIR += rubygem-fog-powerdns SUBDIR += rubygem-fog-profitbricks SUBDIR += rubygem-fog-rackspace SUBDIR += rubygem-fog-radosgw SUBDIR += rubygem-fog-riakcs SUBDIR += rubygem-fog-sakuracloud SUBDIR += rubygem-fog-serverlove SUBDIR += rubygem-fog-softlayer SUBDIR += rubygem-fog-storm_on_demand SUBDIR += rubygem-fog-terremark SUBDIR += rubygem-fog-vmfusion SUBDIR += rubygem-fog-voxel SUBDIR += rubygem-fog-vsphere SUBDIR += rubygem-fog-xenserver SUBDIR += rubygem-geoip SUBDIR += rubygem-gitlab_omniauth-ldap SUBDIR += rubygem-http_parser.rb SUBDIR += rubygem-httpauth SUBDIR += rubygem-ipaddress SUBDIR += rubygem-iproto SUBDIR += rubygem-lita-gems SUBDIR += rubygem-macaddr SUBDIR += rubygem-net-ldap SUBDIR += rubygem-net-netrc SUBDIR += rubygem-net-ping SUBDIR += rubygem-netrc SUBDIR += rubygem-network_interface SUBDIR += rubygem-oauth SUBDIR += rubygem-oauth2 SUBDIR += rubygem-oauth212 SUBDIR += rubygem-octokit SUBDIR += rubygem-octopress-deploy SUBDIR += rubygem-omniauth-auth0 SUBDIR += rubygem-omniauth-authentiq SUBDIR += rubygem-omniauth-azure-oauth2 SUBDIR += rubygem-omniauth-facebook SUBDIR += rubygem-omniauth-github SUBDIR += rubygem-omniauth-github-discourse SUBDIR += rubygem-omniauth-github11 SUBDIR += rubygem-omniauth-google-oauth2 SUBDIR += rubygem-omniauth-oauth SUBDIR += rubygem-omniauth-oauth2 SUBDIR += rubygem-omniauth-openid SUBDIR += rubygem-omniauth-twitter SUBDIR += rubygem-open-uri-cached SUBDIR += rubygem-opennebula SUBDIR += rubygem-packetfu SUBDIR += rubygem-pcaprub SUBDIR += rubygem-qiniu SUBDIR += rubygem-rabbiter SUBDIR += rubygem-rbvmomi SUBDIR += rubygem-right_aws SUBDIR += rubygem-right_flexiscale SUBDIR += rubygem-right_gogrid SUBDIR += rubygem-right_http_connection SUBDIR += rubygem-right_slicehost SUBDIR += rubygem-rsync SUBDIR += rubygem-ruby-growl SUBDIR += rubygem-ruby-openid SUBDIR += rubygem-ruby-yadis SUBDIR += rubygem-ruby_smb SUBDIR += rubygem-rubyntlm SUBDIR += rubygem-rubyntlm05 SUBDIR += rubygem-rubytter SUBDIR += rubygem-rudy SUBDIR += rubygem-rye SUBDIR += rubygem-simple_oauth SUBDIR += rubygem-stompserver SUBDIR += rubygem-t SUBDIR += rubygem-tweetstream SUBDIR += rubygem-twitter SUBDIR += rubygem-twitter-stream SUBDIR += rubygem-twitter4r SUBDIR += rubygem-u2f SUBDIR += rubygem-u2f0 SUBDIR += rubygem-uri-redis SUBDIR += rubygem-whois SUBDIR += rubygem-xmlrpc SUBDIR += rude SUBDIR += s3ql SUBDIR += samba42 SUBDIR += samba43 SUBDIR += samba44 SUBDIR += samba45 SUBDIR += samba46 SUBDIR += samplicator SUBDIR += sbd SUBDIR += sbm SUBDIR += scamper SUBDIR += scapy SUBDIR += scnc SUBDIR += scr_ipfm SUBDIR += scribe SUBDIR += sdl2_net SUBDIR += sdl_net SUBDIR += seda SUBDIR += self-service-password SUBDIR += sendemail SUBDIR += sendsms SUBDIR += sendsnpp SUBDIR += serveez SUBDIR += serviio SUBDIR += sflowtool SUBDIR += shadowsocks-libev SUBDIR += shelldap SUBDIR += shmux SUBDIR += sie-nmsg SUBDIR += simpleproxy SUBDIR += sip_scenario SUBDIR += sippy_b2bua SUBDIR += siproxd SUBDIR += sipsak SUBDIR += sixxs-aiccu SUBDIR += skstream SUBDIR += sl2tps SUBDIR += slurm SUBDIR += smb4k-kde4 SUBDIR += smbldap-tools SUBDIR += smcroute SUBDIR += smm++ SUBDIR += sngrep SUBDIR += sniffit SUBDIR += sntop SUBDIR += sobby SUBDIR += socat SUBDIR += sock SUBDIR += socketbind SUBDIR += socketpipe SUBDIR += socketw SUBDIR += sofia-sip SUBDIR += spideroak SUBDIR += splatd SUBDIR += spoofer SUBDIR += spread SUBDIR += spread-j SUBDIR += spread4 SUBDIR += sqtop SUBDIR += srelay SUBDIR += ss5 SUBDIR += ssldump SUBDIR += sslh SUBDIR += ssltunnel-client SUBDIR += ssltunnel-server SUBDIR += ssmping SUBDIR += ssspl SUBDIR += ssvnc SUBDIR += stf-6rd-kmod SUBDIR += stone SUBDIR += stund SUBDIR += subnetcalc SUBDIR += suckblow SUBDIR += sup SUBDIR += svnup SUBDIR += syncthing SUBDIR += syncthing-cli SUBDIR += syncthing-discosrv SUBDIR += syncthing-inotify SUBDIR += tableutil SUBDIR += tac_plus4 SUBDIR += tapidbus SUBDIR += tayga SUBDIR += tclsoap SUBDIR += tcludp SUBDIR += tcpcat SUBDIR += tcpdstat SUBDIR += tcpdump SUBDIR += tcpflow SUBDIR += tcpick SUBDIR += tcpillust SUBDIR += tcping SUBDIR += tcpkali SUBDIR += tcpmssd SUBDIR += tcpproxy SUBDIR += tcpreen SUBDIR += tcpsg SUBDIR += tcpshow SUBDIR += tcpslice SUBDIR += tcpsplit SUBDIR += tcpstat SUBDIR += tcptestsuite SUBDIR += tcptrace SUBDIR += tcptraceroute SUBDIR += tcptraceroute-devel SUBDIR += tcpview SUBDIR += tcpwatch SUBDIR += tcpxd SUBDIR += tcpxtract SUBDIR += tdetect SUBDIR += tftpgrab SUBDIR += thcrut SUBDIR += throttled SUBDIR += tigervnc SUBDIR += tigervnc-devel SUBDIR += tightvnc SUBDIR += tintin++ SUBDIR += tiny-network-utilities SUBDIR += tinyfugue SUBDIR += tinyldap SUBDIR += tn5250 SUBDIR += tn5250j SUBDIR += toonel SUBDIR += torsocks SUBDIR += traceroute SUBDIR += traff SUBDIR += trafshow SUBDIR += trafshow3 SUBDIR += tramp SUBDIR += trickle SUBDIR += tsclient SUBDIR += tshark SUBDIR += tshark-lite SUBDIR += tsocks SUBDIR += tucan SUBDIR += turnserver SUBDIR += turses SUBDIR += twitux SUBDIR += u6rd SUBDIR += ucarp SUBDIR += udptunnel SUBDIR += udpxy SUBDIR += udt SUBDIR += uget SUBDIR += uhttpmock SUBDIR += ulxmlrpcpp SUBDIR += unfs3 SUBDIR += unison SUBDIR += unison-devel SUBDIR += unison-nox11 SUBDIR += unison232 SUBDIR += unison240 SUBDIR += unix2tcp SUBDIR += uplog SUBDIR += urelay SUBDIR += uriparser SUBDIR += urlendec SUBDIR += usbredir SUBDIR += userfw SUBDIR += utftpd SUBDIR += vblade SUBDIR += vde SUBDIR += vde2 SUBDIR += vinagre SUBDIR += vino SUBDIR += vmware-vsphere-cli SUBDIR += vncreflector SUBDIR += vnstat SUBDIR += vortex SUBDIR += vtun SUBDIR += wackamole SUBDIR += wackford-squeers SUBDIR += wakeonlan SUBDIR += whois SUBDIR += widentd SUBDIR += wireshark SUBDIR += wireshark-lite SUBDIR += wireshark-qt5 SUBDIR += wizd SUBDIR += wlan2eth SUBDIR += wmlj SUBDIR += wmnd SUBDIR += wmnet SUBDIR += wmnet2 SUBDIR += wmnetload SUBDIR += wmnetmon SUBDIR += wmpiki SUBDIR += wmping SUBDIR += wmwave SUBDIR += wmwifi SUBDIR += wmwlmon SUBDIR += wol SUBDIR += wpa_gui SUBDIR += wping SUBDIR += x11vnc SUBDIR += x2goclient SUBDIR += x2goclient-cli SUBDIR += xferstats SUBDIR += xipmsg SUBDIR += xisp SUBDIR += xmlrpc-c SUBDIR += xmlrpc-epi SUBDIR += xorp SUBDIR += xprobe SUBDIR += xpvm SUBDIR += xrdesktop2 SUBDIR += xrdp SUBDIR += xrdp-devel SUBDIR += yami4 SUBDIR += yaph SUBDIR += yate SUBDIR += yaz SUBDIR += yaz++ SUBDIR += yazproxy SUBDIR += yconalyzer SUBDIR += yptransitd SUBDIR += zebra SUBDIR += zebra-server SUBDIR += zeroconf-ioslave SUBDIR += zerotier SUBDIR += zillion SUBDIR += zmap SUBDIR += zsync .include Index: head/net/cloud-init-azure/Makefile =================================================================== --- head/net/cloud-init-azure/Makefile (nonexistent) +++ head/net/cloud-init-azure/Makefile (revision 441117) @@ -0,0 +1,57 @@ +# $FreeBSD$ + +PORTNAME= cloud-init +PORTVERSION= 0.7.9 +CATEGORIES= net python +MASTER_SITES= http://launchpad.net/${PORTNAME}/trunk/${PORTVERSION}/+download/ +PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} +PKGNAMESUFFIX?= -azure + +MAINTAINER= honzhan@microsoft.com +COMMENT= Init scripts for use on cloud images + +LICENSE= GPLv3 +LICENSE_FILE= ${WRKSRC}/LICENSE + +RUN_DEPENDS= dmidecode>0:sysutils/dmidecode \ + e2fsprogs>0:sysutils/e2fsprogs \ + python>0:lang/python \ + ${PYTHON_PKGNAMEPREFIX}boto>0:devel/py-boto \ + ${PYTHON_PKGNAMEPREFIX}Jinja2>0:devel/py-Jinja2 \ + ${PYTHON_PKGNAMEPREFIX}cheetah>0:devel/py-cheetah \ + ${PYTHON_PKGNAMEPREFIX}prettytable>0:devel/py-prettytable \ + ${PYTHON_PKGNAMEPREFIX}configobj>0:devel/py-configobj \ + ${PYTHON_PKGNAMEPREFIX}yaml>0:devel/py-yaml \ + ${PYTHON_PKGNAMEPREFIX}six>0:devel/py-six \ + ${PYTHON_PKGNAMEPREFIX}serial>0:comms/py-serial \ + ${PYTHON_PKGNAMEPREFIX}requests>0:www/py-requests \ + ${PYTHON_PKGNAMEPREFIX}oauthlib>0:security/py-oauthlib \ + ${PYTHON_PKGNAMEPREFIX}jsonpatch>0:devel/py-jsonpatch \ + ${PYTHON_PKGNAMEPREFIX}jsonpointer>0:devel/py-jsonpointer + +ETCDIR= ${PREFIX}/etc/cloud + +USES= python:2.7 shebangfix +SHEBANG_FILES= tools/validate-yaml.py tools/read-dependencies \ + tools/read-version tools/hacking.py +USE_PYTHON= autoplist distutils + +PYDISTUTILS_INSTALLARGS+= "--init-system=sysvinit_freebsd" + +ONLY_FOR_ARCHS= amd64 i386 +ONLY_FOR_ARCHS_REASON= currently depends on dmidecode which is x86-only + +PLIST_DIRS= /var/lib/cloud + +post-patch: + ${REINPLACE_CMD} -e "s,/usr/local,${PREFIX},g" ${WRKSRC}/setup.py + ${REINPLACE_CMD} -e "s,/etc/,${PREFIX}/etc/,g" \ + ${WRKSRC}/cloudinit/settings.py + +post-build: + @cd ${WRKSRC} ; ${MV} config/cloud.cfg-freebsd config/cloud.cfg + +post-install: + ${MKDIR} ${STAGEDIR}/var/lib/cloud + +.include Property changes on: head/net/cloud-init-azure/Makefile ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/net/cloud-init-azure/distinfo =================================================================== --- head/net/cloud-init-azure/distinfo (nonexistent) +++ head/net/cloud-init-azure/distinfo (revision 441117) @@ -0,0 +1,3 @@ +TIMESTAMP = 1495051158 +SHA256 (cloud-init-0.7.9.tar.gz) = 76edb80bf1bdbda68f8014bc057a303ae438a139bdf394e825e548d6ae39d472 +SIZE (cloud-init-0.7.9.tar.gz) = 602188 Property changes on: head/net/cloud-init-azure/distinfo ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/net/cloud-init-azure/files/patch-frbsd-azure.txt =================================================================== --- head/net/cloud-init-azure/files/patch-frbsd-azure.txt (nonexistent) +++ head/net/cloud-init-azure/files/patch-frbsd-azure.txt (revision 441117) @@ -0,0 +1,1213 @@ +--- cloudinit/config/cc_resizefs.py.orig 2016-12-23 16:37:45 UTC ++++ cloudinit/config/cc_resizefs.py +@@ -33,7 +33,10 @@ disabled altogether by setting ``resize_rootfs`` to `` + """ + + import errno ++import getopt + import os ++import re ++import shlex + import stat + + from cloudinit.settings import PER_ALWAYS +@@ -58,6 +61,62 @@ def _resize_ufs(mount_point, devpth): + return ('growfs', devpth) + + ++def _get_dumpfs_output(mount_point): ++ dumpfs_res, err = util.subp(['dumpfs', '-m', mount_point]) ++ return dumpfs_res ++ ++ ++def _get_gpart_output(part): ++ gpart_res, err = util.subp(['gpart', 'show', part]) ++ return gpart_res ++ ++ ++def _can_skip_resize_ufs(mount_point, devpth): ++ # extract the current fs sector size ++ """ ++ # dumpfs -m / ++ # newfs command for / (/dev/label/rootfs) ++ newfs -O 2 -U -a 4 -b 32768 -d 32768 -e 4096 -f 4096 -g 16384 ++ -h 64 -i 8192 -j -k 6408 -m 8 -o time -s 58719232 /dev/label/rootf ++ """ ++ cur_fs_sz = None ++ frag_sz = None ++ dumpfs_res = _get_dumpfs_output(mount_point) ++ for line in dumpfs_res.splitlines(): ++ if not line.startswith('#'): ++ newfs_cmd = shlex.split(line) ++ opt_value = 'O:Ua:s:b:d:e:f:g:h:i:jk:m:o:' ++ optlist, args = getopt.getopt(newfs_cmd[1:], opt_value) ++ for o, a in optlist: ++ if o == "-s": ++ cur_fs_sz = int(a) ++ if o == "-f": ++ frag_sz = int(a) ++ # check the current partition size ++ """ ++ # gpart show /dev/da0 ++=> 40 62914480 da0 GPT (30G) ++ 40 1024 1 freebsd-boot (512K) ++ 1064 58719232 2 freebsd-ufs (28G) ++ 58720296 3145728 3 freebsd-swap (1.5G) ++ 61866024 1048496 - free - (512M) ++ """ ++ expect_sz = None ++ m = re.search('^(/dev/.+)p([0-9])$', devpth) ++ gpart_res = _get_gpart_output(m.group(1)) ++ for line in gpart_res.splitlines(): ++ if re.search(r"freebsd-ufs", line): ++ fields = line.split() ++ expect_sz = int(fields[1]) ++ # Normalize the gpart sector size, ++ # because the size is not exactly the same as fs size. ++ normal_expect_sz = (expect_sz - expect_sz % (frag_sz / 512)) ++ if normal_expect_sz == cur_fs_sz: ++ return True ++ else: ++ return False ++ ++ + # Do not use a dictionary as these commands should be able to be used + # for multiple filesystem types if possible, e.g. one command for + # ext2, ext3 and ext4. +@@ -68,6 +127,10 @@ RESIZE_FS_PREFIXES_CMDS = [ + ('ufs', _resize_ufs), + ] + ++RESIZE_FS_PRECHECK_CMDS = { ++ 'ufs': _can_skip_resize_ufs ++} ++ + NOBLOCK = "noblock" + + +@@ -90,6 +153,14 @@ def rootdev_from_cmdline(cmdline): + return "/dev/" + found + + ++def can_skip_resize(fs_type, resize_what, devpth): ++ fstype_lc = fs_type.lower() ++ for i, func in RESIZE_FS_PRECHECK_CMDS.items(): ++ if fstype_lc.startswith(i): ++ return func(resize_what, devpth) ++ return False ++ ++ + def handle(name, cfg, _cloud, log, args): + if len(args) != 0: + resize_root = args[0] +@@ -158,6 +229,11 @@ def handle(name, cfg, _cloud, log, args): + return + + resizer = None ++ if can_skip_resize(fs_type, resize_what, devpth): ++ log.debug("Skip resize filesystem type %s for %s", ++ fs_type, resize_what) ++ return ++ + fstype_lc = fs_type.lower() + for (pfix, root_cmd) in RESIZE_FS_PREFIXES_CMDS: + if fstype_lc.startswith(pfix): +--- cloudinit/distros/__init__.py.orig 2016-12-23 16:37:45 UTC ++++ cloudinit/distros/__init__.py +@@ -142,6 +142,9 @@ class Distro(object): + ns, header=header, render_hwaddress=True) + return self.apply_network(contents, bring_up=bring_up) + ++ def generate_fallback_config(self): ++ return net.generate_fallback_config() ++ + def apply_network_config(self, netconfig, bring_up=False): + # apply network config netconfig + # This method is preferred to apply_network which only takes +--- cloudinit/distros/freebsd.py.orig 2016-12-23 16:37:45 UTC ++++ cloudinit/distros/freebsd.py +@@ -30,6 +30,7 @@ class Distro(distros.Distro): + login_conf_fn_bak = '/etc/login.conf.orig' + resolv_conf_fn = '/etc/resolv.conf' + ci_sudoers_fn = '/usr/local/etc/sudoers.d/90-cloud-init-users' ++ default_primary_nic = 'hn0' + + def __init__(self, name, cfg, paths): + distros.Distro.__init__(self, name, cfg, paths) +@@ -38,6 +39,8 @@ class Distro(distros.Distro): + # should only happen say once per instance...) + self._runner = helpers.Runners(paths) + self.osfamily = 'freebsd' ++ self.ipv4_pat = re.compile(r"\s+inet\s+\d+[.]\d+[.]\d+[.]\d+") ++ cfg['ssh_svcname'] = 'sshd' + + # Updates a key in /etc/rc.conf. + def updatercconf(self, key, value): +@@ -183,7 +186,6 @@ class Distro(distros.Distro): + "gecos": '-c', + "primary_group": '-g', + "groups": '-G', +- "passwd": '-h', + "shell": '-s', + "inactive": '-E', + } +@@ -193,19 +195,11 @@ class Distro(distros.Distro): + "no_log_init": '--no-log-init', + } + +- redact_opts = ['passwd'] +- + for key, val in kwargs.items(): + if (key in adduser_opts and val and + isinstance(val, six.string_types)): + adduser_cmd.extend([adduser_opts[key], val]) + +- # Redact certain fields from the logs +- if key in redact_opts: +- log_adduser_cmd.extend([adduser_opts[key], 'REDACTED']) +- else: +- log_adduser_cmd.extend([adduser_opts[key], val]) +- + elif key in adduser_flags and val: + adduser_cmd.append(adduser_flags[key]) + log_adduser_cmd.append(adduser_flags[key]) +@@ -226,19 +220,21 @@ class Distro(distros.Distro): + except Exception as e: + util.logexc(LOG, "Failed to create user %s", name) + raise e ++ # Set the password if it is provided ++ # For security consideration, only hashed passwd is assumed ++ passwd_val = kwargs.get('passwd', None) ++ if passwd_val is not None: ++ self.set_passwd(name, passwd_val, hashed=True) + + def set_passwd(self, user, passwd, hashed=False): +- cmd = ['pw', 'usermod', user] +- + if hashed: +- cmd.append('-H') ++ hash_opt = "-H" + else: +- cmd.append('-h') ++ hash_opt = "-h" + +- cmd.append('0') +- + try: +- util.subp(cmd, passwd, logstring="chpasswd for %s" % user) ++ util.subp(['pw', 'usermod', user, hash_opt, '0'], ++ data=passwd, logstring="chpasswd for %s" % user) + except Exception as e: + util.logexc(LOG, "Failed to set password for %s", user) + raise e +@@ -270,6 +266,255 @@ class Distro(distros.Distro): + if 'ssh_authorized_keys' in kwargs: + keys = set(kwargs['ssh_authorized_keys']) or [] + ssh_util.setup_user_keys(keys, name, options=None) ++ ++ @staticmethod ++ def get_ifconfig_list(): ++ cmd = ['ifconfig', '-l'] ++ (nics, err) = util.subp(cmd, rcs=[0, 1]) ++ if len(err): ++ LOG.warn("Error running %s: %s", cmd, err) ++ return None ++ return nics ++ ++ @staticmethod ++ def get_ifconfig_ifname_out(ifname): ++ cmd = ['ifconfig', ifname] ++ (if_result, err) = util.subp(cmd, rcs=[0, 1]) ++ if len(err): ++ LOG.warn("Error running %s: %s", cmd, err) ++ return None ++ return if_result ++ ++ @staticmethod ++ def get_ifconfig_ether(): ++ cmd = ['ifconfig', '-l', 'ether'] ++ (nics, err) = util.subp(cmd, rcs=[0, 1]) ++ if len(err): ++ LOG.warn("Error running %s: %s", cmd, err) ++ return None ++ return nics ++ ++ @staticmethod ++ def get_interface_mac(ifname): ++ if_result = Distro.get_ifconfig_ifname_out(ifname) ++ for item in if_result.splitlines(): ++ if item.find('ether ') != -1: ++ mac = str(item.split()[1]) ++ if mac: ++ return mac ++ ++ @staticmethod ++ def get_devicelist(): ++ nics = Distro.get_ifconfig_list() ++ return nics.split() ++ ++ @staticmethod ++ def get_ipv6(): ++ ipv6 = [] ++ nics = Distro.get_devicelist() ++ for nic in nics: ++ if_result = Distro.get_ifconfig_ifname_out(nic) ++ for item in if_result.splitlines(): ++ if item.find("inet6 ") != -1 and item.find("scopeid") == -1: ++ ipv6.append(nic) ++ return ipv6 ++ ++ def get_ipv4(self): ++ ipv4 = [] ++ nics = Distro.get_devicelist() ++ for nic in nics: ++ if_result = Distro.get_ifconfig_ifname_out(nic) ++ for item in if_result.splitlines(): ++ print(item) ++ if self.ipv4_pat.match(item): ++ ipv4.append(nic) ++ return ipv4 ++ ++ def is_up(self, ifname): ++ if_result = Distro.get_ifconfig_ifname_out(ifname) ++ pat = "^" + ifname ++ for item in if_result.splitlines(): ++ if re.match(pat, item): ++ flags = item.split('<')[1].split('>')[0] ++ if flags.find("UP") != -1: ++ return True ++ ++ def _get_current_rename_info(self, check_downable=True): ++ """Collect information necessary for rename_interfaces.""" ++ names = Distro.get_devicelist() ++ bymac = {} ++ for n in names: ++ bymac[Distro.get_interface_mac(n)] = { ++ 'name': n, 'up': self.is_up(n), 'downable': None} ++ ++ if check_downable: ++ nics_with_addresses = set() ++ ipv6 = self.get_ipv6() ++ ipv4 = self.get_ipv4() ++ for bytes_out in (ipv6, ipv4): ++ for i in ipv6: ++ nics_with_addresses.update(i) ++ for i in ipv4: ++ nics_with_addresses.update(i) ++ ++ for d in bymac.values(): ++ d['downable'] = (d['up'] is False or ++ d['name'] not in nics_with_addresses) ++ ++ return bymac ++ ++ def _rename_interfaces(self, renames): ++ if not len(renames): ++ LOG.debug("no interfaces to rename") ++ return ++ ++ current_info = self._get_current_rename_info() ++ ++ cur_bymac = {} ++ for mac, data in current_info.items(): ++ cur = data.copy() ++ cur['mac'] = mac ++ cur_bymac[mac] = cur ++ ++ def update_byname(bymac): ++ return dict((data['name'], data) ++ for data in bymac.values()) ++ ++ def rename(cur, new): ++ util.subp(["ifconfig", cur, "name", new], capture=True) ++ ++ def down(name): ++ util.subp(["ifconfig", name, "down"], capture=True) ++ ++ def up(name): ++ util.subp(["ifconfig", name, "up"], capture=True) ++ ++ ops = [] ++ errors = [] ++ ups = [] ++ cur_byname = update_byname(cur_bymac) ++ tmpname_fmt = "cirename%d" ++ tmpi = -1 ++ ++ for mac, new_name in renames: ++ cur = cur_bymac.get(mac, {}) ++ cur_name = cur.get('name') ++ cur_ops = [] ++ if cur_name == new_name: ++ # nothing to do ++ continue ++ ++ if not cur_name: ++ errors.append("[nic not present] Cannot rename mac=%s to %s" ++ ", not available." % (mac, new_name)) ++ continue ++ ++ if cur['up']: ++ msg = "[busy] Error renaming mac=%s from %s to %s" ++ if not cur['downable']: ++ errors.append(msg % (mac, cur_name, new_name)) ++ continue ++ cur['up'] = False ++ cur_ops.append(("down", mac, new_name, (cur_name,))) ++ ups.append(("up", mac, new_name, (new_name,))) ++ ++ if new_name in cur_byname: ++ target = cur_byname[new_name] ++ if target['up']: ++ msg = "[busy-target] Error renaming mac=%s from %s to %s." ++ if not target['downable']: ++ errors.append(msg % (mac, cur_name, new_name)) ++ continue ++ else: ++ cur_ops.append(("down", mac, new_name, (new_name,))) ++ ++ tmp_name = None ++ while tmp_name is None or tmp_name in cur_byname: ++ tmpi += 1 ++ tmp_name = tmpname_fmt % tmpi ++ ++ cur_ops.append(("rename", mac, new_name, (new_name, tmp_name))) ++ target['name'] = tmp_name ++ cur_byname = update_byname(cur_bymac) ++ if target['up']: ++ ups.append(("up", mac, new_name, (tmp_name,))) ++ ++ cur_ops.append(("rename", mac, new_name, (cur['name'], new_name))) ++ cur['name'] = new_name ++ cur_byname = update_byname(cur_bymac) ++ ops += cur_ops ++ ++ opmap = {'rename': rename, 'down': down, 'up': up} ++ if len(ops) + len(ups) == 0: ++ if len(errors): ++ LOG.debug("unable to do any work for renaming of %s", renames) ++ else: ++ LOG.debug("no work necessary for renaming of %s", renames) ++ else: ++ LOG.debug("achieving renaming of %s with ops %s", ++ renames, ops + ups) ++ ++ for op, mac, new_name, params in ops + ups: ++ try: ++ opmap.get(op)(*params) ++ except Exception as e: ++ errors.append( ++ "[unknown] Error performing %s%s for %s, %s: %s" % ++ (op, params, mac, new_name, e)) ++ if len(errors): ++ raise Exception('\n'.join(errors)) ++ ++ def apply_network_config_names(self, netcfg): ++ renames = [] ++ for ent in netcfg.get('config', {}): ++ if ent.get('type') != 'physical': ++ continue ++ mac = ent.get('mac_address') ++ name = ent.get('name') ++ if not mac: ++ continue ++ renames.append([mac, name]) ++ return self._rename_interfaces(renames) ++ ++ @classmethod ++ def generate_fallback_config(self): ++ nics = Distro.get_ifconfig_ether() ++ if nics is None: ++ LOG.debug("Fail to get network interfaces") ++ return None ++ potential_interfaces = nics.split() ++ connected = [] ++ for nic in potential_interfaces: ++ pat = "^" + nic ++ if_result = Distro.get_ifconfig_ifname_out(nic) ++ for item in if_result.split("\n"): ++ if re.match(pat, item): ++ flags = item.split('<')[1].split('>')[0] ++ if flags.find("RUNNING") != -1: ++ connected.append(nic) ++ if connected: ++ potential_interfaces = connected ++ names = list(sorted(potential_interfaces)) ++ default_pri_nic = Distro.default_primary_nic ++ if default_pri_nic in names: ++ names.remove(default_pri_nic) ++ names.insert(0, default_pri_nic) ++ target_name = None ++ target_mac = None ++ for name in names: ++ mac = Distro.get_interface_mac(name) ++ if mac: ++ target_name = name ++ target_mac = mac ++ break ++ if target_mac and target_name: ++ nconf = {'config': [], 'version': 1} ++ nconf['config'].append( ++ {'type': 'physical', 'name': target_name, ++ 'mac_address': target_mac, 'subnets': [{'type': 'dhcp'}]}) ++ return nconf ++ else: ++ return None + + def _write_network(self, settings): + entries = net_util.translate_network(settings) +--- cloudinit/settings.py.orig 2016-12-23 16:37:45 UTC ++++ cloudinit/settings.py +@@ -37,7 +37,7 @@ CFG_BUILTIN = { + ], + 'def_log_file': '/var/log/cloud-init.log', + 'log_cfgs': [], +- 'syslog_fix_perms': ['syslog:adm', 'root:adm'], ++ 'syslog_fix_perms': ['syslog:adm', 'root:adm', 'root:wheel'], + 'system_info': { + 'paths': { + 'cloud_dir': '/var/lib/cloud', +--- cloudinit/sources/DataSourceAzure.py.orig 2016-12-23 16:37:45 UTC ++++ cloudinit/sources/DataSourceAzure.py +@@ -10,6 +10,7 @@ import crypt + from functools import partial + import os + import os.path ++import re + import time + from xml.dom import minidom + import xml.etree.ElementTree as ET +@@ -32,19 +33,160 @@ BOUNCE_COMMAND = [ + # azure systems will always have a resource disk, and 66-azure-ephemeral.rules + # ensures that it gets linked to this path. + RESOURCE_DISK_PATH = '/dev/disk/cloud/azure_resource' ++DEFAULT_PRIMARY_NIC = 'eth0' ++LEASE_FILE = '/var/lib/dhcp/dhclient.eth0.leases' ++DEFAULT_FS = 'ext4' + ++ ++def find_storvscid_from_sysctl_pnpinfo(sysctl_out, deviceid): ++ # extract the 'X' from dev.storvsc.X. if deviceid matches ++ """ ++ dev.storvsc.1.%pnpinfo: ++ classid=32412632-86cb-44a2-9b5c-50d1417354f5 ++ deviceid=00000000-0001-8899-0000-000000000000 ++ """ ++ for line in sysctl_out.splitlines(): ++ if re.search(r"pnpinfo", line): ++ fields = line.split() ++ if len(fields) >= 3: ++ columns = fields[2].split('=') ++ if (len(columns) >= 2 and ++ columns[0] == "deviceid" and ++ columns[1].startswith(deviceid)): ++ comps = fields[0].split('.') ++ return comps[2] ++ return None ++ ++ ++def find_busdev_from_disk(camcontrol_out, disk_drv): ++ # find the scbusX from 'camcontrol devlist -b' output ++ # if disk_drv matches the specified disk driver, i.e. blkvsc1 ++ """ ++ scbus0 on ata0 bus 0 ++ scbus1 on ata1 bus 0 ++ scbus2 on blkvsc0 bus 0 ++ scbus3 on blkvsc1 bus 0 ++ scbus4 on storvsc2 bus 0 ++ scbus5 on storvsc3 bus 0 ++ scbus-1 on xpt0 bus 0 ++ """ ++ for line in camcontrol_out.splitlines(): ++ if re.search(disk_drv, line): ++ items = line.split() ++ return items[0] ++ return None ++ ++ ++def find_dev_from_busdev(camcontrol_out, busdev): ++ # find the daX from 'camcontrol devlist' output ++ # if busdev matches the specified value, i.e. 'scbus2' ++ """ ++ at scbus1 target 0 lun 0 (cd0,pass0) ++ at scbus2 target 0 lun 0 (da0,pass1) ++ at scbus3 target 1 lun 0 (da1,pass2) ++ """ ++ for line in camcontrol_out.splitlines(): ++ if re.search(busdev, line): ++ items = line.split('(') ++ if len(items) == 2: ++ dev_pass = items[1].split(',') ++ return dev_pass[0] ++ return None ++ ++ ++def get_dev_storvsc_sysctl(): ++ try: ++ sysctl_out, err = util.subp(['sysctl', 'dev.storvsc']) ++ except util.ProcessExecutionError: ++ LOG.debug("Fail to execute sysctl dev.storvsc") ++ return None ++ return sysctl_out ++ ++ ++def get_camcontrol_dev_bus(): ++ try: ++ camcontrol_b_out, err = util.subp(['camcontrol', 'devlist', '-b']) ++ except util.ProcessExecutionError: ++ LOG.debug("Fail to execute camcontrol devlist -b") ++ return None ++ return camcontrol_b_out ++ ++ ++def get_camcontrol_dev(): ++ try: ++ camcontrol_out, err = util.subp(['camcontrol', 'devlist']) ++ except util.ProcessExecutionError: ++ LOG.debug("Fail to execute camcontrol devlist") ++ return None ++ return camcontrol_out ++ ++ ++def get_resource_disk_on_freebsd(port_id): ++ g0 = "00000000" ++ if port_id > 1: ++ g0 = "00000001" ++ port_id = port_id - 2 ++ g1 = "000" + str(port_id) ++ g0g1 = "{0}-{1}".format(g0, g1) ++ """ ++ search 'X' from ++ 'dev.storvsc.X.%pnpinfo: ++ classid=32412632-86cb-44a2-9b5c-50d1417354f5 ++ deviceid=00000000-0001-8899-0000-000000000000' ++ """ ++ sysctl_out = get_dev_storvsc_sysctl() ++ ++ storvscid = find_storvscid_from_sysctl_pnpinfo(sysctl_out, g0g1) ++ if not storvscid: ++ LOG.debug("Fail to find storvsc id from sysctl") ++ return None ++ ++ camcontrol_b_out = get_camcontrol_dev_bus() ++ camcontrol_out = get_camcontrol_dev() ++ # try to find /dev/XX from 'blkvsc' device ++ blkvsc = "blkvsc{0}".format(storvscid) ++ scbusx = find_busdev_from_disk(camcontrol_b_out, blkvsc) ++ if scbusx: ++ devname = find_dev_from_busdev(camcontrol_out, scbusx) ++ if devname is None: ++ LOG.debug("Fail to find /dev/daX") ++ return None ++ return devname ++ # try to find /dev/XX from 'storvsc' device ++ storvsc = "storvsc{0}".format(storvscid) ++ scbusx = find_busdev_from_disk(camcontrol_b_out, storvsc) ++ if scbusx: ++ devname = find_dev_from_busdev(camcontrol_out, scbusx) ++ if devname is None: ++ LOG.debug("Fail to find /dev/daX") ++ return None ++ return devname ++ return None ++ ++# update the FreeBSD specific information ++if util.is_FreeBSD(): ++ DEFAULT_PRIMARY_NIC = 'hn0' ++ LEASE_FILE = '/var/db/dhclient.leases.hn0' ++ DEFAULT_FS = 'freebsd-ufs' ++ res_disk = get_resource_disk_on_freebsd(1) ++ if res_disk is not None: ++ LOG.debug("resource disk is not None") ++ RESOURCE_DISK_PATH = "/dev/" + res_disk ++ else: ++ LOG.debug("resource disk is None") ++ + BUILTIN_DS_CONFIG = { + 'agent_command': AGENT_START_BUILTIN, + 'data_dir': "/var/lib/waagent", + 'set_hostname': True, + 'hostname_bounce': { +- 'interface': 'eth0', ++ 'interface': DEFAULT_PRIMARY_NIC, + 'policy': True, + 'command': BOUNCE_COMMAND, + 'hostname_command': 'hostname', + }, + 'disk_aliases': {'ephemeral0': RESOURCE_DISK_PATH}, +- 'dhclient_lease_file': '/var/lib/dhcp/dhclient.eth0.leases', ++ 'dhclient_lease_file': LEASE_FILE, + } + + BUILTIN_CLOUD_CONFIG = { +@@ -53,7 +195,7 @@ BUILTIN_CLOUD_CONFIG = { + 'layout': [100], + 'overwrite': True}, + }, +- 'fs_setup': [{'filesystem': 'ext4', ++ 'fs_setup': [{'filesystem': DEFAULT_FS, + 'device': 'ephemeral0.1', + 'replace_fs': 'ntfs'}], + } +@@ -178,7 +320,11 @@ class DataSourceAzureNet(sources.DataSource): + for cdev in candidates: + try: + if cdev.startswith("/dev/"): +- ret = util.mount_cb(cdev, load_azure_ds_dir) ++ if util.is_FreeBSD(): ++ ret = util.mount_cb(cdev, load_azure_ds_dir, ++ mtype="udf", sync=False) ++ else: ++ ret = util.mount_cb(cdev, load_azure_ds_dir) + else: + ret = load_azure_ds_dir(cdev) + +@@ -206,11 +352,13 @@ class DataSourceAzureNet(sources.DataSource): + LOG.debug("using files cached in %s", ddir) + + # azure / hyper-v provides random data here +- seed = util.load_file("/sys/firmware/acpi/tables/OEM0", +- quiet=True, decode=False) +- if seed: +- self.metadata['random_seed'] = seed + ++ if not util.is_FreeBSD(): ++ seed = util.load_file("/sys/firmware/acpi/tables/OEM0", ++ quiet=True, decode=False) ++ if seed: ++ self.metadata['random_seed'] = seed ++ # TODO. find the seed on FreeBSD platform + # now update ds_cfg to reflect contents pass in config + user_ds_cfg = util.get_cfg_by_path(self.cfg, DS_CFG_PATH, {}) + self.ds_cfg = util.mergemanydict([user_ds_cfg, self.ds_cfg]) +@@ -619,8 +767,19 @@ def encrypt_pass(password, salt_id="$6$"): + def list_possible_azure_ds_devs(): + # return a sorted list of devices that might have a azure datasource + devlist = [] +- for fstype in ("iso9660", "udf"): +- devlist.extend(util.find_devs_with("TYPE=%s" % fstype)) ++ if util.is_FreeBSD(): ++ cdrom_dev = "/dev/cd0" ++ try: ++ util.subp(["mount", "-o", "ro", "-t", "udf", cdrom_dev, ++ "/mnt/cdrom/secure"]) ++ except util.ProcessExecutionError: ++ LOG.debug("Fail to mount cd") ++ return devlist ++ util.subp(["umount", "/mnt/cdrom/secure"]) ++ devlist.append(cdrom_dev) ++ else: ++ for fstype in ("iso9660", "udf"): ++ devlist.extend(util.find_devs_with("TYPE=%s" % fstype)) + + devlist.sort(reverse=True) + return devlist +--- cloudinit/sources/helpers/azure.py.orig 2016-12-23 16:37:45 UTC ++++ cloudinit/sources/helpers/azure.py +@@ -29,6 +29,14 @@ def cd(newdir): + os.chdir(prevdir) + + ++def get_azure_endpoint(): ++ if util.is_FreeBSD(): ++ azure_endpoint = "option-245" ++ else: ++ azure_endpoint = "unknown-245" ++ return azure_endpoint ++ ++ + class AzureEndpointHttpClient(object): + + headers = { +@@ -236,7 +244,8 @@ class WALinuxAgentShim(object): + content = util.load_file(fallback_lease_file) + LOG.debug("content is %s", content) + for line in content.splitlines(): +- if 'unknown-245' in line: ++ azure_endpoint = get_azure_endpoint() ++ if azure_endpoint in line: + # Example line from Ubuntu + # option unknown-245 a8:3f:81:10; + leases.append(line.strip(' ').split(' ', 2)[-1].strip(';\n"')) +--- cloudinit/stages.py.orig 2016-12-23 16:37:45 UTC ++++ cloudinit/stages.py +@@ -616,7 +616,7 @@ class Init(object): + return (None, loc) + if ncfg: + return (ncfg, loc) +- return (net.generate_fallback_config(), "fallback") ++ return (self.distro.generate_fallback_config(), "fallback") + + def apply_network_config(self, bring_up): + netcfg, src = self._find_networking_config() +--- cloudinit/util.py.orig 2016-12-23 16:37:45 UTC ++++ cloudinit/util.py +@@ -565,6 +565,10 @@ def is_ipv4(instr): + return len(toks) == 4 + + ++def is_FreeBSD(): ++ return system_info()['platform'].startswith('FreeBSD') ++ ++ + def get_cfg_option_bool(yobj, key, default=False): + if key not in yobj: + return default +@@ -2091,11 +2095,56 @@ def parse_mtab(path): + return None + + ++def find_freebsd_part(label_part): ++ if label_part.startswith("/dev/label/"): ++ target_label = label_part[5:] ++ (label_part, err) = subp(['glabel', 'status', '-s']) ++ for labels in label_part.split("\n"): ++ items = labels.split() ++ if len(items) > 0 and items[0].startswith(target_label): ++ label_part = items[2] ++ break ++ label_part = str(label_part) ++ return label_part ++ ++ ++def get_path_dev_freebsd(path, mnt_list): ++ path_found = None ++ for line in mnt_list.split("\n"): ++ items = line.split() ++ if (len(items) > 2 and os.path.exists(items[1] + path)): ++ path_found = line ++ break ++ return path_found ++ ++ ++def get_mount_info_freebsd(path, log=LOG): ++ (result, err) = subp(['mount', '-p', path], rcs=[0, 1]) ++ if len(err): ++ # find a path if the input is not a mounting point ++ (mnt_list, err) = subp(['mount', '-p']) ++ path_found = get_path_dev_freebsd(path, mnt_list) ++ if (path_found is None): ++ return None ++ result = path_found ++ ret = result.split() ++ label_part = find_freebsd_part(ret[0]) ++ return "/dev/" + label_part, ret[2], ret[1] ++ ++ + def parse_mount(path): + (mountoutput, _err) = subp("mount") + mount_locs = mountoutput.splitlines() + for line in mount_locs: + m = re.search(r'^(/dev/[\S]+) on (/.*) \((.+), .+, (.+)\)$', line) ++ if not m: ++ continue ++ # check whether the dev refers to a label on FreeBSD ++ # for example, if dev is '/dev/label/rootfs', we should ++ # continue finding the real device like '/dev/da0'. ++ devm = re.search('^(/dev/.+)p([0-9])$', m.group(1)) ++ if (not devm and is_FreeBSD()): ++ return get_mount_info_freebsd(path) + devpth = m.group(1) + mount_point = m.group(2) + fs_type = m.group(3) +@@ -2357,7 +2406,8 @@ def read_dmi_data(key): + uname_arch = os.uname()[4] + if not (uname_arch == "x86_64" or + (uname_arch.startswith("i") and uname_arch[2:] == "86") or +- uname_arch == 'aarch64'): ++ uname_arch == 'aarch64' or ++ uname_arch == 'amd64'): + LOG.debug("dmidata is not supported on %s", uname_arch) + return None + +--- config/cloud.cfg-freebsd.orig 2016-12-23 16:37:45 UTC ++++ config/cloud.cfg-freebsd +@@ -5,7 +5,7 @@ syslog_fix_perms: root:wheel + + # This should not be required, but leave it in place until the real cause of + # not beeing able to find -any- datasources is resolved. +-datasource_list: ['ConfigDrive', 'OpenStack', 'Ec2'] ++datasource_list: ['ConfigDrive', 'Azure', 'OpenStack', 'Ec2'] + + # A set of users which may be applied and/or used by various modules + # when a 'default' entry is found it will reference the 'default_user' +--- requirements.txt.orig 2016-12-23 16:37:45 UTC ++++ requirements.txt +@@ -28,7 +28,7 @@ configobj>=5.0.2 + pyyaml + + # The new main entrypoint uses argparse instead of optparse +-argparse ++# argparse + + # Requests handles ssl correctly! + requests +--- setup.py.orig 2016-12-23 16:37:45 UTC ++++ setup.py +@@ -87,9 +87,9 @@ ETC = "/etc" + USR_LIB_EXEC = "/usr/lib" + LIB = "/lib" + if os.uname()[0] == 'FreeBSD': ++ ETC = "/usr/local/etc" + USR = "/usr/local" + USR_LIB_EXEC = "/usr/local/lib" +- ETC = "/usr/local/etc" + elif os.path.isfile('/etc/redhat-release'): + USR_LIB_EXEC = "/usr/libexec" + +@@ -166,8 +166,6 @@ else: + (ETC + '/cloud', glob('config/*.cfg')), + (ETC + '/cloud/cloud.cfg.d', glob('config/cloud.cfg.d/*')), + (ETC + '/cloud/templates', glob('templates/*')), +- (ETC + '/NetworkManager/dispatcher.d/', ['tools/hook-network-manager']), +- (ETC + '/dhcp/dhclient-exit-hooks.d/', ['tools/hook-dhclient']), + (USR_LIB_EXEC + '/cloud-init', ['tools/uncloud-init', + 'tools/write-ssh-key-fingerprints']), + (USR + '/share/doc/cloud-init', [f for f in glob('doc/*') if is_f(f)]), +@@ -175,8 +173,13 @@ else: + [f for f in glob('doc/examples/*') if is_f(f)]), + (USR + '/share/doc/cloud-init/examples/seed', + [f for f in glob('doc/examples/seed/*') if is_f(f)]), +- (LIB + '/udev/rules.d', [f for f in glob('udev/*.rules')]), + ] ++ if os.uname()[0] != 'FreeBSD': ++ data_files.append([ ++ (ETC + '/NetworkManager/dispatcher.d/', ['tools/hook-network-manager']), ++ (ETC + '/dhcp/dhclient-exit-hooks.d/', ['tools/hook-dhclient']), ++ (LIB + '/udev/rules.d', [f for f in glob('udev/*.rules')]), ++ ]) + # Use a subclass for install that handles + # adding on the right init system configuration files + cmdclass = { +@@ -187,6 +190,9 @@ else: + requirements = read_requires() + if sys.version_info < (3,): + requirements.append('cheetah') ++if ((sys.version_info.major == 2 and sys.version_info.minor < 7) or ++ (sys.version_info.major == 3 and sys.version_info.minor < 2)): ++ requirements.append('argparse') + + setuptools.setup( + name='cloud-init', +--- sysvinit/freebsd/cloudconfig.orig 2016-12-23 16:37:45 UTC ++++ sysvinit/freebsd/cloudconfig +@@ -7,23 +7,13 @@ + . /etc/rc.subr + + PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +-export CLOUD_CFG=/usr/local/etc/cloud/cloud.cfg + + name="cloudconfig" + command="/usr/local/bin/cloud-init" + start_cmd="cloudconfig_start" + stop_cmd=":" + rcvar="cloudinit_enable" +-start_precmd="cloudinit_override" + start_cmd="cloudconfig_start" +- +-cloudinit_override() +-{ +- # If there exist sysconfig/defaults variable override files use it... +- if [ -f /etc/defaults/cloud-init ]; then +- . /etc/defaults/cloud-init +- fi +-} + + cloudconfig_start() + { +--- sysvinit/freebsd/cloudfinal.orig 2016-12-23 16:37:45 UTC ++++ sysvinit/freebsd/cloudfinal +@@ -7,23 +7,13 @@ + . /etc/rc.subr + + PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +-export CLOUD_CFG=/usr/local/etc/cloud/cloud.cfg + + name="cloudfinal" + command="/usr/local/bin/cloud-init" + start_cmd="cloudfinal_start" + stop_cmd=":" + rcvar="cloudinit_enable" +-start_precmd="cloudinit_override" + start_cmd="cloudfinal_start" +- +-cloudinit_override() +-{ +- # If there exist sysconfig/defaults variable override files use it... +- if [ -f /etc/defaults/cloud-init ]; then +- . /etc/defaults/cloud-init +- fi +-} + + cloudfinal_start() + { +--- sysvinit/freebsd/cloudinit.orig 2016-12-23 16:37:45 UTC ++++ sysvinit/freebsd/cloudinit +@@ -7,23 +7,13 @@ + . /etc/rc.subr + + PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +-export CLOUD_CFG=/usr/local/etc/cloud/cloud.cfg + + name="cloudinit" + command="/usr/local/bin/cloud-init" + start_cmd="cloudinit_start" + stop_cmd=":" + rcvar="cloudinit_enable" +-start_precmd="cloudinit_override" + start_cmd="cloudinit_start" +- +-cloudinit_override() +-{ +- # If there exist sysconfig/defaults variable override files use it... +- if [ -f /etc/defaults/cloud-init ]; then +- . /etc/defaults/cloud-init +- fi +-} + + cloudinit_start() + { +--- sysvinit/freebsd/cloudinitlocal.orig 2016-12-23 16:37:45 UTC ++++ sysvinit/freebsd/cloudinitlocal +@@ -1,29 +1,19 @@ + #!/bin/sh + + # PROVIDE: cloudinitlocal +-# REQUIRE: mountcritlocal ++# REQUIRE: ldconfig mountcritlocal + # BEFORE: NETWORKING FILESYSTEMS cloudinit cloudconfig cloudfinal + + . /etc/rc.subr + + PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +-export CLOUD_CFG=/usr/local/etc/cloud/cloud.cfg + + name="cloudinitlocal" + command="/usr/local/bin/cloud-init" + start_cmd="cloudlocal_start" + stop_cmd=":" + rcvar="cloudinit_enable" +-start_precmd="cloudinit_override" + start_cmd="cloudlocal_start" +- +-cloudinit_override() +-{ +- # If there exist sysconfig/defaults variable override files use it... +- if [ -f /etc/defaults/cloud-init ]; then +- . /etc/defaults/cloud-init +- fi +-} + + cloudlocal_start() + { +--- tests/unittests/test_datasource/test_azure.py.orig 2016-12-23 16:37:45 UTC ++++ tests/unittests/test_datasource/test_azure.py +@@ -3,6 +3,8 @@ + from cloudinit import helpers + from cloudinit.util import b64e, decode_binary, load_file + from cloudinit.sources import DataSourceAzure ++from cloudinit.util import find_freebsd_part ++from cloudinit.util import get_path_dev_freebsd + + from ..helpers import TestCase, populate_dir, mock, ExitStack, PY26, SkipTest + +@@ -95,6 +97,41 @@ class TestAzureDataSource(TestCase): + for module, name, new in patches: + self.patches.enter_context(mock.patch.object(module, name, new)) + ++ def _get_mockds(self): ++ mod = DataSourceAzure ++ sysctl_out = "dev.storvsc.3.%pnpinfo: "\ ++ "classid=ba6163d9-04a1-4d29-b605-72e2ffb1dc7f "\ ++ "deviceid=f8b3781b-1e82-4818-a1c3-63d806ec15bb\n" ++ sysctl_out += "dev.storvsc.2.%pnpinfo: "\ ++ "classid=ba6163d9-04a1-4d29-b605-72e2ffb1dc7f "\ ++ "deviceid=f8b3781a-1e82-4818-a1c3-63d806ec15bb\n" ++ sysctl_out += "dev.storvsc.1.%pnpinfo: "\ ++ "classid=32412632-86cb-44a2-9b5c-50d1417354f5 "\ ++ "deviceid=00000000-0001-8899-0000-000000000000\n" ++ camctl_devbus = """ ++scbus0 on ata0 bus 0 ++scbus1 on ata1 bus 0 ++scbus2 on blkvsc0 bus 0 ++scbus3 on blkvsc1 bus 0 ++scbus4 on storvsc2 bus 0 ++scbus5 on storvsc3 bus 0 ++scbus-1 on xpt0 bus 0 ++ """ ++ camctl_dev = """ ++ at scbus1 target 0 lun 0 (cd0,pass0) ++ at scbus2 target 0 lun 0 (da0,pass1) ++ at scbus3 target 1 lun 0 (da1,pass2) ++ """ ++ self.apply_patches([ ++ (mod, 'get_dev_storvsc_sysctl', mock.MagicMock( ++ return_value=sysctl_out)), ++ (mod, 'get_camcontrol_dev_bus', mock.MagicMock( ++ return_value=camctl_devbus)), ++ (mod, 'get_camcontrol_dev', mock.MagicMock( ++ return_value=camctl_dev)) ++ ]) ++ return mod ++ + def _get_ds(self, data, agent_command=None): + + def dsdevs(): +@@ -176,6 +213,34 @@ class TestAzureDataSource(TestCase): + except AssertionError: + return + raise AssertionError("XML is the same") ++ ++ def test_get_resource_disk(self): ++ ds = self._get_mockds() ++ dev = ds.get_resource_disk_on_freebsd(1) ++ self.assertEqual("da1", dev) ++ ++ @mock.patch('cloudinit.util.subp') ++ def test_find_freebsd_part_on_Azure(self, mock_subp): ++ glabel_out = ''' ++gptid/fa52d426-c337-11e6-8911-00155d4c5e47 N/A da0p1 ++ label/rootfs N/A da0p2 ++ label/swap N/A da0p3 ++''' ++ mock_subp.return_value = (glabel_out, "") ++ res = find_freebsd_part("/dev/label/rootfs") ++ self.assertEqual("da0p2", res) ++ ++ def test_get_path_dev_freebsd_on_Azure(self): ++ mnt_list = ''' ++/dev/label/rootfs / ufs rw 1 1 ++devfs /dev devfs rw,multilabel 0 0 ++fdescfs /dev/fd fdescfs rw 0 0 ++/dev/da1s1 /mnt/resource ufs rw 2 2 ++''' ++ with mock.patch.object(os.path, 'exists', ++ return_value=True): ++ res = get_path_dev_freebsd('/etc', mnt_list) ++ self.assertNotEqual(res, None) + + def test_basic_seed_dir(self): + odata = {'HostName': "myhost", 'UserName': "myuser"} +--- tests/unittests/test_datasource/test_azure_helper.py.orig 2016-12-23 16:37:45 UTC ++++ tests/unittests/test_datasource/test_azure_helper.py +@@ -72,10 +72,11 @@ class TestFindEndpoint(TestCase): + + @staticmethod + def _build_lease_content(encoded_address): ++ endpoint = azure_helper.get_azure_endpoint() + return '\n'.join([ + 'lease {', + ' interface "eth0";', +- ' option unknown-245 {0};'.format(encoded_address), ++ ' option {0} {1};'.format(endpoint, encoded_address), + '}']) + + def test_from_dhcp_client(self): +--- tests/unittests/test_datasource/test_cloudstack.py.orig 2016-12-23 16:37:45 UTC ++++ tests/unittests/test_datasource/test_cloudstack.py +@@ -15,6 +15,11 @@ class TestCloudStackPasswordFetching(TestCase): + mod_name = 'cloudinit.sources.DataSourceCloudStack' + self.patches.enter_context(mock.patch('{0}.ec2'.format(mod_name))) + self.patches.enter_context(mock.patch('{0}.uhelp'.format(mod_name))) ++ default_gw = "192.201.20.0" ++ mod_name = 'cloudinit.sources.DataSourceCloudStack.get_default_gateway' ++ get_default_gw = mock.MagicMock(return_value=default_gw) ++ self.patches.enter_context( ++ mock.patch(mod_name, get_default_gw)) + + def _set_password_server_response(self, response_string): + subp = mock.MagicMock(return_value=(response_string, '')) +--- tests/unittests/test_distros/test_netconfig.py.orig 2016-12-23 16:37:45 UTC ++++ tests/unittests/test_distros/test_netconfig.py +@@ -83,6 +83,20 @@ class WriteBuffer(object): + + class TestNetCfgDistro(TestCase): + ++ frbsd_ifout = """\ ++hn0: flags=8843 metric 0 mtu 1500 ++ options=51b ++ ether 00:15:5d:4c:73:00 ++ inet6 fe80::215:5dff:fe4c:7300%hn0 prefixlen 64 scopeid 0x2 ++ inet 10.156.76.127 netmask 0xfffffc00 broadcast 10.156.79.255 ++ nd6 options=23 ++ media: Ethernet autoselect (10Gbase-T ) ++ status: active ++""" ++ ++ def setUp(self): ++ super(TestNetCfgDistro, self).setUp() ++ + def _get_distro(self, dname): + cls = distros.fetch(dname) + cfg = settings.CFG_BUILTIN +@@ -126,6 +140,29 @@ class TestNetCfgDistro(TestCase): + self.assertIn(k, b1) + for (k, v) in b1.items(): + self.assertEqual(v, b2[k]) ++ ++ @mock.patch('cloudinit.distros.freebsd.Distro.get_ifconfig_list') ++ @mock.patch('cloudinit.distros.freebsd.Distro.get_ifconfig_ifname_out') ++ def test_get_ip_nic_freebsd(self, ifname_out, iflist): ++ frbsd_distro = self._get_distro('freebsd') ++ iflist.return_value = "lo0 hn0" ++ ifname_out.return_value = self.frbsd_ifout ++ res = frbsd_distro.get_ipv4() ++ self.assertEqual(res, ['lo0', 'hn0']) ++ res = frbsd_distro.get_ipv6() ++ self.assertEqual(res, []) ++ ++ @mock.patch('cloudinit.distros.freebsd.Distro.get_ifconfig_ether') ++ @mock.patch('cloudinit.distros.freebsd.Distro.get_ifconfig_ifname_out') ++ @mock.patch('cloudinit.distros.freebsd.Distro.get_interface_mac') ++ def test_generate_fallback_config_freebsd(self, mac, ifname_out, if_ether): ++ frbsd_distro = self._get_distro('freebsd') ++ ++ if_ether.return_value = 'hn0' ++ ifname_out.return_value = self.frbsd_ifout ++ mac.return_value = '00:15:5d:4c:73:00' ++ res = frbsd_distro.generate_fallback_config() ++ self.assertIsNotNone(res) + + def test_simple_write_rh(self): + rh_distro = self._get_distro('rhel') +--- tests/unittests/test_util.py.orig 2016-12-23 16:37:45 UTC ++++ tests/unittests/test_util.py +@@ -567,7 +567,8 @@ class TestSubp(helpers.TestCase): + def test_subp_capture_stderr(self): + data = b'hello world' + (out, err) = util.subp(self.stdin2err, capture=True, +- decode=False, data=data) ++ decode=False, data=data, ++ update_env={'LC_ALL': 'C'}) + self.assertEqual(err, data) + self.assertEqual(out, b'') + +--- tools/build-on-freebsd.orig 2016-12-23 16:37:45 UTC ++++ tools/build-on-freebsd +@@ -3,16 +3,14 @@ + # installing cloud-init. This script takes care of building and installing. It + # will optionally make a first run at the end. + +-fail() { echo "FAILED:" "$@" 1>&2; exit 1; } ++fail() { echo "FAILED:" "$@" 1>&2; exit 1;} + + # Check dependencies: + depschecked=/tmp/c-i.dependencieschecked + pkgs=" + dmidecode + e2fsprogs +- gpart + py27-Jinja2 +- py27-argparse + py27-boto + py27-cheetah + py27-configobj +@@ -38,7 +36,7 @@ python setup.py build + python setup.py install -O1 --skip-build --prefix /usr/local/ --init-system sysvinit_freebsd + + # Install the correct config file: +-cp config/cloud.cfg-freebsd /usr/local/etc/cloud/cloud.cfg ++cp config/cloud.cfg-freebsd /etc/cloud/cloud.cfg + + # Enable cloud-init in /etc/rc.conf: + sed -i.bak -e "/cloudinit_enable=.*/d" /etc/rc.conf Property changes on: head/net/cloud-init-azure/files/patch-frbsd-azure.txt ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/net/cloud-init-azure/pkg-descr =================================================================== --- head/net/cloud-init-azure/pkg-descr (nonexistent) +++ head/net/cloud-init-azure/pkg-descr (revision 441117) @@ -0,0 +1,3 @@ +Package provides configuration and customization of Azure instance. + +WWW: https://launchpad.net/cloud-init Property changes on: head/net/cloud-init-azure/pkg-descr ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/net/cloud-init-azure/pkg-message =================================================================== --- head/net/cloud-init-azure/pkg-message (nonexistent) +++ head/net/cloud-init-azure/pkg-message (revision 441117) @@ -0,0 +1,7 @@ +========================================================== +To enable cloud-init, add the following line to rc.conf: + +cloudinit_enable="YES" + +This will make sure cloud-init is started at boot. +========================================================== Property changes on: head/net/cloud-init-azure/pkg-message ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property