Launchpad, formerly apnscp, has officially launched. It’s built on PHP 7.1 (yay!), Bootstrap 4 alpha6, jQuery 3, and given significant internal changes, its version number has been bumped to 3.0.  It also drops support for IE9. The user interface has been redesigned to be cleaner, friendier on mobile devices, and customizable.

Launchpad. New dashboard.
apnscp Retro Theme

Theme City

Two themes have been included, which can be selected via AccountSettings (formerly “Change Information”). A SDK will be published shortly allowing for user-defined themes. Secondary users now support email addresses via User > Manage Users. These can be used to alert the user of unauthorized logins on the account, password reset requests, or for two-factor authentication (coming soon!). All emails tie into Gravatar, so set one up if you have not yet. Gravatar is also integrated into WordPress, who also owns that service.

2-Click 1-Click Updates

In addition, 1-clicks now have a 2-click upgrade process to upgrade every 1-click application unassisted. Some of our clients managing 100+ WordPress sites have asked and we’re obliged to provide – plus the backend legwork to make this a reality was fun (see: app sideloading). Visit Web > Web Apps to get started and if you are one of the 100+ WordPress site owners, you can grab a coffee. It’ll take a few minutes.

2-Click update for 1-Click installs

Sideloads

App sideloads are now part of the panel. Any app can call another app’s controller or model to interact with it. This simplifies development upkeep on our end and enhances application scopes.

Feature requests

Launchpad would not have happened and developed the way it has without client feedback. With Launchpad, it’s even easier to lend some inspiration using the Feedback tool available on every app. If you have an idea – no matter how dumb it may be (and there have been a few!) – send some feedback. Even if I can’t work with the idea directly, any insight can catalyze the next big thing.

Feedback tool in Launchpad

Database snapshots

Snapshots are now available for PostgreSQL and MySQL. Select the Advanced menu () from the database listing to get started. Snapshots are written to disk without compression, but automatically delete after 5 days. From testing, snapshots are between 6x to 15x larger than compressed nightly backups depending upon algorithm (bzip is best).

Database snapshot in Launchpad
Database restore in Launchpad

Database imports

There are 2 ways to import a database into Launchpad, excluding phpMyAdmin which was the way to import traditionally. First, when creating a database, select the Advanced menu (). Second option, once a database has been created, is to manipulate snapshots by placing an uncompressed SQL backup named after the respective backup in your backup directory. Both work very well.

Database import

Odds and ends

Commit annotation naming conventions will change slightly. Lowercase annotations now reference modules or backend changes whereas Title Case refers to frontend applications or components (or sTuDLY CaSe with MySQL/PostgreSQL). There will continue to be some exceptions including “apnscp.js” that is frontend. If affected change annotated in lowercase, then assume it refers to a backend module.

And one last thing. Check out Beacon! You can script with Launchpad from the shell, including some really cool, really easy multi-user ACL management.

– Matt

Changelog

  • NEW: Launchpad 3.0 release built on PHP 7.1 + Bootstrap v4.0-alpha6 + jQuery 3.1 with some Laravel inspiration
  • NEW: layout
  • NEW: multiple theme support, retro styling for those that miss Apis
  • NEW: toggle nav behavior (Settings)
  • NEW: app sideloading
  • NEW: sub-user email address support
  • NEW: integrate Gravatar into theme
  • NEW: WordPress installer option, “squash”. Squash changes ownership on install to match profile UID rather than parent directory UID
  • NEW: Session and Preferences interfaces for simplified session + preference management
  • NEW: quick link top 3 most-used applications (Dashboard)
  • NEW: 1-click mass updates (Web Apps)
  • NEW: global AJAX popup events
  • NEW: set per-user email (Settings)
  • NEW: buildup_shadow()- create component directories in shadow to ensure parents exist and fix file ghosting on OverlayFS-backed platforms (File)
  • NEW: set_acls()- support clearing all and specific user ACL entries (File)
  • NEW: use date as log suffix (Log Rotation)
  • NEW: add/remove SANs from Let’s Encrypt without first deleting (letsencrypt)
  • NEW: Surrogates. Surrogates are delegated, custom modules that extend version-controlled modules
  • NEW: bootstrap server Let’s Encrypt certificate if not present (letsencrypt)
  • NEW: yum filesystem template synchronization. Ties into yum-plugin-post-transaction-actions to keep FST in sync with root packages automatically
  • NEW: download filesystem + database of supported apps (Web Apps)
  • NEW: repair table support (MySQL Manager)
  • NEW: min/max worker process management
  • NEW: configuration-driven located under conf/
  • NEW: add snapshot, rollback, import, export support for PostgreSQL (sql)
  • NEW: truncate/empty mysql databases via truncate_mysql_database()/empty_mysql_database(), truncate preserves table structure, zeroing out records, whereas empty preserves database configuration (sql)
  • NEW: import database backup on creation, click the ADVANCED dropdown indicator (MySQL Manager)
  • NEW: snapshot and restore from backups (MySQL Manager)
  • NEW: _cron() magic module method, periodically invoked by apnscpd to process routine tasks
  • NEW: automatic server certificate renewal (Let’s Encrypt)
  • NEW: disable/enable cronjobs via disable_job(
  • NEW: schedule cronjob for immediate execution (Task Scheduler)
  • NEW: drag & drop file upload support (File Manager)
  • NEW: add reload hook, active() method to check if hooks are in use (Util_Account::Hooks)
  • NEW: namespaced process callbacks (type.namespace) and option callbacks (Util_Process)
  • NEW: ulimit management (Util_Ulimit)
  • NEW: mass detection mode (Web Apps)
  • NEW: ajaxQueue() – serialize ajax requests (apnscp.js)
  • NEW: Super Global cache, unified across all CP installations
  • FIX: cwd missing from modal-based postback (File Manager)
  • FIX: uninstalled application persists in webapp map without running detect (Webapps)
  • FIX: webhook initialization deadlock (Auth)
  • FIX: Bootstrap 4 alpha6 fixes
  • FIX: buildup_shadow() ignores last directory in build up (File)
  • FIX: gethostbyname timeout waaaaaayyyy too short (letsencrypt)
  • FIX: gethostbyaddr_t does not always return tthe correct IP (Net)
  • FIX: PEAR PHP7 fixes
  • FIX: dateext never sets (Log Rotate)
  • FIX: wait on memcached to spawn before caching application config
  • FIX: permit wildcard paths in fortification profiles (Webapps)
  • FIX: perform simple NS query to validate domain delegation. If domain is not properly delegated, because nameservers respond non-authoritatively, call down TLD hierarchy to verify last delegated nameserver in chain references nameservers. Without doing so, a domain delegated to use hosting nameservers can’t be swapped in as primary unless those nameservers were previously provisioned with zone data (DNS)
  • FIX: /var/spool incorrectly chmoded to 700 on v6.5+ platforms (crontab)
  • FIX: add_mysql_user()- max connections always defaults to 0 on user creation (SQL)
  • FIX: module methods with duplicate name as Module_Skeleton are ignored in WSDL generation (SOAP)
  • FIX: move()- overwriting an existing file results in ghosting on v6+ platforms. Stop acting directly on shadow for any write ops, use shadow only for permission check (File)
  • FIX: unset engine parameter (AJAX)
  • FIX: add PTR sanity check on edit hook + post-migration (DNS)
  • FIX: getHostingNameservers(), unknown function (DNS Manager)
  • FIX: move() perform move on synthetic fs rather than r/w layer on OverlayFS-based platforms (file)
  • FIX: args POST parameter supercedes merging $_GET/$_POST (AJAX)
  • FIX: request()- array_unique() preserves keys resulting in missed domains during reachability check (letsencrypt)
  • FIX: check if files under shared mount (“/.socket”) and bypass replicating
  • FIX: domain_on_account()- domains on subordinates return false (DNS)
  • FIX: user rename broken
  • FIX: list_subdomains()- irresolvable subdomain symlink reports empty path (Web)
  • FIX: exit codes ignored if zero formatted arguments specified in command (Util_Process)
  • FIX: domain_hosting()- ignore_on_account parameter logic, incorrectly returned true for non-hosted domains (DNS)
  • FIX: Let’s Encrypt certificate transfers into named local directory on destination (Transfer)
  • FIX: get_database_size() don’t bother on non-directories (SQL)
  • FIX: non-static method CLI_Transfer::log() should not be called statically (Transfer)
  • FIX: decrement loop constraint if common name unreachable (letsencrypt)
  • FIX: prevent syncing duplicate cronjobs during migration (Transfer)
  • FIX: ensure timezone is UTC when working with non-system timezone settings (Util_Process::Schedule)
  • FIX: reset locale and timezone if no override specified (afi)
  • FIX: ensure bool value is represented as 1 or 0 (Util_Account::Editor)
  • FIX: siteinfo.pwoverride meta does nothing (Auth)
  • FIX: file_noconflict(), ensure path is absolute (File Manager)
  • FIX: tar archive does not extract (File)
  • FIX: AJAX engine “cmd” can sometimes be interpreted as XML or non-JSON (AJAX Engine)
  • FIX: deprecated function rename_mailbox() signature mismatch with modify_mailbox (email)
  • FIX: erroneous loop termination in db sync (Transfer)
  • FIX: FormData.set() not supported by Safari (Trouble Tickets)
  • FIX: migrate mysql databases that use canonicalized name variant (“-” -> @002) (Transfer)
  • FIX: sync crontab comments and env variables (Transfer)
  • FIX: race condition in assigning an IP address multiple times if recycled from a suspended account and the suspended account is later removed, the PTR allocated to the new account is incorrectly released. Tag PTR to account and check PTR result before determining whether to release the IP address (DNS)
  • FIX: implement missing Joomla! update
  • FIX: map addon domain to main user if document root owner is below acceptable UID range, e.g. apache ownership (aliases)
  • FIX: Tomcat ownership could linger on a site that had Tomcat previously enabled. Include UID in valid map if Tomcat is permitted on account (file)
  • FIX: remove unnecessary shebang from joomlatools
  • FIX: db_config()- guard against incomplete/invalid WordPress installations (wordpress)
  • FIX: password reset broken on new config layout platforms
  • FIX: batch accepts zero arguments (Util_Process_Batch)
  • FIX: multiple email addresses ignored on initial ticket filing if filer is admin (crm)
  • FIX: force authentication, instead of failure, if /etc/shadow timestamp drifts (SOAP)
  • FIX: gmail email fixup, reply indicator does not always follow rn
  • FIX: uploaded files lack actions (File Manager)
  • FIX: bitrot (reset_password.sh)
  • FIX: rename broken (File Manager)
  • FIX: db connection references old configuration (backup dbs)
  • FIX: prettyprint DNS entries if TXT record balanced with 1 pair of double-quotes (DNS)
  • FIX: treat None as null (Account Editor)
  • FIX: remove erroneous substitution of pg dbs with hyphen (sql)
  • FIX: double-escape single quoted arguments since su also uses single quotes to escape the command (Sudo)
  • FIX: stat()- referent calculation on platforms with a shadow layer (file)
  • FIX: update()- overlayfs workaround, purge fs cache prior to stat() (drupal)
  • FIX: utf8 names (DAV)
  • FIX: permission bypass, unprivileged users may download all directories on an account irrespective of permissions. Fix by checking ownership of each requested directory for unprivileged users before processing (File Manager)
  • FIX: get_mime_type()- handle undetectable mime types gracefully (file)
  • FIX: get_database_size()- canonicalize MySQL database if necessary (sql)
  • FIX: on v6.5+ platforms, purge filesystem cache after account deletion to prevent ghosting on account wipes (deleteDomain)
  • FIX: path check uses db literal instead of transliteral (db backup)
  • FIX: “server” template var source (crm)
  • FIX: reap forked processes (apnscpd)
  • FIX: /ajax?engine=app defines AJAX twice (Page Container)
  • FIX: Generate Request panel hidden if SSL not permitted on account with no means to activate (SSL)
  • FIX: duplicate site id usage during pwoverride flag toggle (Transfer)
  • FIX: check if lock still present before unlink (Auth::DAV)
  • FIX: $this bound in closure does not inherit class, workaround for PHP 5.3 (Pman)
  • FIX: injection attack on ajax?engine=cmd, fn could be built-in PHP function allowing arbitrary code execution (AJAX cmd)
  • FIX: move user/domain arguments to setOption to avoid misinterpretation of command-line arguments as sudo settings (Pman)
  • FIX: handle case when CLI and SERVER_ADDR env is not set (Util::HTTP)
  • FIX: update email to username map on account owner change (Email)
  • FIX: Remember Me does nothing (Login)
  • FIX: scroll response into view broken after bootstrap conversion (Trouble Tickets)
  • FIX: enter on input fields should trigger form submission, not username/domain change (Change Information)
  • FIX: resetting account results in infinite login redirection loop (Login)
  • FIX: propagate update information for non-7.xbranches (Drupal)
  • FIX: find_quota_files()- glob path not expanded (User)
  • FIX: lockdown()- verify docroot ownership before performing lockdown (watch)
  • FIX: disabled services collapse columns in user listing (Manage Users)
  • FIX: release fortification leaves permissions in an inconsistent state (Web Apps)
  • FIX: set cache expiry on system status report (Login)
  • CHG: deduplicate webapps installation routines (webapps)
  • CHG: flip array_first() callback param order, [value, key] (helpers)
  • CHG: chown() allow user to be a valid UID (file)
  • CHG: squash option for webapps. When true, the webapp installation will inherit the current UID rather than the parent directory UID for the installed application. Resolves issue when site admin installs app over secondary user (webapps)
  • CHG: ensure vacation check runs last (Dashboard)
  • CHG: rework login notifications and sideloading
  • CHG: select nav pill automatically on page load, history paging (apnscp.js)
  • CHG: rename Account > Change Information to Settings
  • CHG: shorthand Auth::get_driver()->session_valid() to Auth::authenticated()
  • CHG: provisionally load assets on non-AJAX/non-sideload requests (Page Container)
  • CHG: get_service_value(), support optional default third parameter (Module Skeleton)
  • CHG: put graph key on a diet
  • CHG: include EOL conversion on file properties (File Manager)
  • CHG: update_all() order, transpose core update with themes (wordpress)
  • CHG: include wp-content/wflogs in max fortification profile (wordpress)
  • CHG: PHP7 compatibility, change apc_* functions to apcu
  • CHG: refer to cgroup account meta for limits (cgroup)
  • CHG: default fortification mode max (Webapps)
  • CHG: letsencrypt debug mode now tunable, only use testing server while debugging (letsencrypt)
  • CHG: storage amnesty mulitplier based off 100% (account)
  • CHG: parse domainmap instead of DB4. DB4 builds linked against 4.7 segfault on newer platforms (Auth)
  • CHG: domain_uses_nameservers()- make strict interpretation, fail if no nameservers set (dns)
  • CHG: move domain_is_delegated() whitelabel check to dns module (domain_uses_nameservers()) (Aliases)
  • CHG: get_authns_from_host()- return null if resolve fails before completing chain, e.g. non-existent domain jdskhffdfhjsdf.com will fail after .com resolves returning null instead of an empty array (DNS)
  • CHG: visibility on get_records, get_records_by_rr (DNS)
  • CHG: use sha256 to generate API key (auth)
  • CHG: add personality support (Php)
  • CHG: add 1 sec sleep between failed Let’s Encrypt requests (nonce token mismatch primary cause) (Letsencrypt)
  • CHG: challenge_token()- expose challenge URL to API to facilitate addon domain scripting (Aliases)
  • CHG: add_alias()- move to backend only, add_alias() alters configuration profile and is functionally equivalent to add_shared_domain(domain, /var/www/html). By exposing add_alias, it runs the same checks as add_shared_domain(), which invokes it (Aliases)
  • CHG: migrate MySQL database as-is, don’t strip prefix which can cause confusion if the database is named after its prefix (Transfer)
  • CHG: include hostname of record modified (Transfer)
  • CHG: set_acls()- adjust $xtra to accept “recursive”/”default” option in addition to R/d for simplified API usage (file)
  • CHG: if subdomain binding null, default to login domain instead of every domain (User Defaults)
  • CHG: allow specifying an extraneous list of files to fortify() (Webapps)
  • CHG: use timeout when querying remote WP versions
  • CHG: use hostineer for CP redirects now (Auth::Redirect)
  • CHG: move()- skip delete() call for optimized layout and call unlink() directly (File)
  • CHG: strip http:// and https:// from addon domain if present (Addon Domains)
  • CHG: refactor add_virtual_transport (email)
  • CHG: get_records() lookup timeout from 1 to 3 seconds (DNS)
  • CHG: add_alias()- cleanup DNS checks (Aliases)
  • CHG: add hostineer nameservers as valid nameservers
  • CHG: Sol (v6) now uses OverlayFS, tweak cutoff to include v6 (file)
  • CHG: use shadow path when creating MySQL database on v6+ platforms. OverlayFS will ghost on file operations to shadow layer if that file is accessed from the composite layer (fst/). Because mysqld is the only process to see these files and will always refer to the shadow layer this becomes inconsequential; direct path access is around 5-7% faster too. (SQL)
  • CHG: rename DNS_INTERNAL/DNS_EXTERNAL to DNS_AUTHORITATIVE/DNS_RECURSIVE (dns)
  • CHG: semantics, reference EXTERNAL NAMESERVER to query DNS records via gethostbyaddr() as INTERNAL NAMESERVER is purposed to be authoritative
  • CHG: use @ instead of # for sib login (Terminal)
  • CHG: rollout namebased certificates for v6 platforms (SSL)
  • CHG: disambiguate internal/master nameserver (DNS)
  • CHG: enable unrestricted SSL on Luna+ platforms
  • CHG: redirect invalid requests back to login (Page Container)
  • CHG: check_user() no longer warns if user missing from getpwnam() (Util_Pam)
  • CHG: simplify PAM lookup (Util_Pam)
  • CHG: if catchall conversion guess fails, default to account admin (Transfer)
  • CHG: stick delivery mode to last mode (Manage Mailboxes)
  • CHG: move hosting nameserver settings to config.ini (DNS)
  • CHG: up user default quota from 40 MB to 500 MB
  • CHG: portability improvement, check uid instead of IS_CLI apnscp constant (Util_Process:Sudo)
  • CHG: cleanup duplicate wildcard apply, do not export support module methods (apnscpFunctionInterceptor)
  • CHG: revert back to null response on unrenewable certificate (letsencrypt)
  • CHG: support null backend return (DataStream)
  • CHG: login panel flex fixes (Login)
  • CHG: coalesce stderr/stdout streams in wp-cli since getting the right stream is a crapshoot (wordpress)
  • CHG: HTTPS available for phpMyAdmin/phpPgAdmin on v5+ platforms
  • CHG: reload vsftpd on new LE cert issuance (ftp)
  • CHG: flush passwd cache on user creation (user)
  • CHG: reduce default TTL for dyndns to 5 min, new records 12 hours (DNS)
  • CHG: enable email (IMAP/SMTP) explicitly using API rather than relying on Ensim conventions (User)
  • CHG: flag domains under the same invoice as owned irrespective nameserver or IP address (aliases)
  • CHG: rely on API methods to get dest/src platform versions (Transfer)
  • CHG: add platform_version() (misc)
  • CHG: implicitly call generation action to build RPM cache if necessary (Synchronizer)
  • CHG: include OBSOLETED and OBSOLETING states (Synchronizer)
  • CHG: support for platform versions that deviate from suggested OS release pairing
  • CHG: detect filesystem block size (config)
  • CHG: get_directory_contents()- cleanup path formatting (File)
  • CHG: certificate alternative form is now tunable via letsencrypt.alternative_form (letsencrypt)
  • CHG: sync Let’s Encrypt certificates during migration
  • CHG: update tar header regex to match abbreviated HH:MM timestamps (Regex)
  • CHG: allow remotely-hosted domain promotion to parent if domain matches account DNS (auth)
  • CHG: send file tree data as plain-text to avoid pagespeed optimization (AJAX Engine)
  • CHG: Util_Process doesn’t like mixing named + unnamed arg specs (WordPress)
  • CHG: skip siteXX.ssl if SSL disabled on account (Transfer)
  • CHG: when multiple contacts are specified in a ticket, if one contact updates, send a notice to all parties (crm)
  • CHG: add “in reply to” data to plain-text template (crm)
  • CHG: add_attachment()- improve verbosity if attachment fails to save to database (crm)
  • CHG: repair_mysql_database()- calculating REPAIR TABLE space requirements should use largest table, not database size (sql)
  • CHG: endow_upload()- clamp down on contract requirements (file)
  • CHG: make silence() really silent – suppress everything (Error Reporter)
  • CHG: clear buffer rather than merge after silence() is called (error reporter)
  • CHG: repair_mysql_database()- ignore empty databases in myisamchk (SQL)
  • CHG: add_user()- cp service is not automatic enrollment if disabled by default, forcefully enable CP (user)
  • CHG: mute dns_get_record() (dns)
  • CHG: apply “password contains user” security check only if 0-4 characters precede or follow proposed password (Auth)
  • CHG: keep active DB/user highlighted after edit (MySQL Manager)
  • CHG: experimental dechunkification (parseTicket)
  • CHG: configuration shimming via “SHIM” preload constant
  • CHG: allow multiple invocations of set_temp_password and preserve the original account password if invoked multiple times (auth)
  • CHG: housekeeping callback, purge pagespeed cache (misc)
  • CHG: wait for memcached socket before proceeding with configuration initialization (apnscpd)
  • CHG: force socket for memcached backend
  • CHG: toggle email notifications for username/password/domain change + unrecognized logins (Change Information)
  • CHG: reflow Change Information
  • CHG: signal()- force data type conversion to int (pman)
  • CHG: allow normalize_path() to work on symlinks (Web)
  • CHG: add MUA sniffing for MUA-specific fixups (parseTicket)
  • CHG: skip revocation before renewal, if renewal fails certificate is invalid (letsencrypt)
  • CHG: pg_vaccum_db()- suppress vacuum output (sql)
  • CHG: move PGPASSWORD environment over to setEnvironment()
  • CHG: ajax error indicator (CSS)
  • CHG: $from_email is not always set, ensure WP can send via wp-includes/pluggable.php (wordpress)
  • CHG: **IMPORTANT** only enumerate files in shadow layer instead of composite, which is RO and therefore immutable and non-essential to account usage. This change will mask system libraries and binaries (/bin, /lib, /usr/share) from File Manager view as well as any file_* operation. In testing, masking RO files introduced no API disruption and should have no impact on CP operation. Masking reduces cache memory footprint and enumeration performance. (File Manager, file)
  • CHG: make_path()- support ~ notation to automatically expand to user home (file)
  • CHG: implement file download blacklist, a list of files to never download when downloading a directory as any user, e.g. /root and /etc/shadow (File Manager)
  • CHG: portability, tie ER reporting verbosity to function instead of hardcoding is_debug() into ER (Error_Reporter)
  • CHG: turn off error verbosity in AJAX requests as it has a tendency to break JSON parsing
  • CHG: move()- no files moved is now considered an error (file)
  • CHG: import_mysql(), import_pgsql()- allow importing from archives (sql)
  • CHG: purge snapshots after 5 days (backup dbs)
  • CHG: set socket timeout for SOAP operations to 3 minutes (Transfer)
  • CHG: remove wp-cli if module more recent than wp-cli driver (wordpress)
  • CHG: skip polling on ticket submission (Trouble Tickets)
  • CHG: do housekeeping in separate process to reduce startup time (apnscpd)
  • CHG: let autoload take priority over module loading (apnscpFunctionInterceptor)
  • CHG: set AJAX mode if Accept request header contains application/json (Page Container)
  • CHG: breakout class configuration to global configuration
  • CHG: propagate timezone setting to bash shell (common)
  • CHG: Util_Process::Tee rewrite, leverage callback infrastructure to tee output to a given file
  • CHG: permit primary user grant deletion if delete hook mode set (sql)
  • CHG: replcae multiupload with SimpleUpload
  • CHG: allow direct PAM operations via hooks (Util::PAM)
  • CHG: generate Message-ID header for all emails
  • CHG: include GeoIP on credential changes
  • CHG: prefer doveadm on v6+ platforms (Email)
  • CHG: restrict IMAP, SMTP, FTP, and SSH access for demo accounts
  • CHG: make user/domain parameters setOption() calls rather than additional parameters to exec(). Resolves situations in which a named argument may also be named “user” (Util_Process::Sudo)
  • CHG: exec callback occurs before proc_open (Util_Process)
  • CHG: add support to renew server cert (Letsencrypt)
  • CHG: sync up composite cache prior to creating addon domain doc root (Aliases)
  • CHG: use a better hashing algorithm for credit card numbers in the recurring batch (Billing)
  • CHG: updating expiration on 1 card updates expiration on all matching cards in the recurring batch (Billing)
  • CHG: disable pw change notice during password sync on server migration (Transfer)
  • CHG: ucwords() backwards compatibility with PHP < 5.4.32 or 5.5.16 (Util_Process)
  • CHG: get_procs()- ensure return type is always array (pman)
  • CHG: run()- extract timeout into Util_Process (pman)
  • CHG: namespaced callbacks (type.namespace) (Util_Process)
  • CHG: drop login shell, sudo root as root fails (Util_Process::Sudo)
  • CHG: check active atd dispatches if named id is running (Util_Process::Schedule)
  • CHG: set_temp_password()- default timeout, 30 -> 60 (Auth)
  • CHG: Analytics/chart colors, padding (Dashboard)
  • CHG: disable security notifications for demo accounts (Login)
  • CHG: always update security challenge key (Login)
  • CHG: always update security challenge key (Login)
  • CHG: track browser logins for unrecognized/unauthorized entities (Login)
  • CHG: add security override config to stop alerts when logging into an account to verify a concern (Auth)
  • CHG: htmlize password reset request (Login)
  • CHG: only update gecos, email address on field change (Change Information)
  • CHG: rename Personalities to .htaccess Manager
  • CHG: add notification hooks on email, username change (Change Information)
  • CHG: cleanup Personalities, rename to .htaccess Manager
  • CHG: add autoload support to non-namespaced vendor libraries (apnscpFunctionInterceptor)
  • CHG: add notification support for account username/password changes
  • CHG: reduce second stage transfer overlap window from 30 seconds to 30 minutes to account extreme drift/clock sync problems (Transfer)
  • CHG: support blowfish crypted password ($2x$ shadow notation) (Auth)
  • CHG: set()- third parameter, type (soft/hard) is now optional (Util_Ulimit)
  • CHG: purge filesystem cache after deleting placeholder (Webapps)
  • CHG: new ticket email template, include contexts (Trouble Tickets)
  • CHG: redirect to ticket overview if response flagged as closed (Trouble Tickets)
  • CHG: cleanup cgroup controller creation (Cgroup)
  • CHG: inject cgconfig configuration on account addition/deletion (Cgroup)
  • CHG: tweak login icons (Login)
  • CHG: include What’s New in login page (Login)
  • CHG: verify database size before exporting, relax fsize ulimit if necessary (SQL)
  • CHG: read from cgroup.procs rather than stat()’ing /proc to determine account PIDs. ~3x performance improvement (pman)
  • CHG: dump overlayfs page cache on site deletion (File)
  • CHG: set maintenance mode on update (Drupal)
  • CHG: refactor *_uninstall to parent class (Webapps)
  • CHG: add option to uninstall database (Webapps)
  • CHG: remove Magento support from platforms <= v4.5
  • CHG: move call_app() ajax generation to helper function, call_app_ajax() (apnscp.js)
  • CHG: reset ajax wait indicator (apnscp.js)
  • CHG: sort domains by domain => subdomain rather than alphabetically and by level (Webapps)
  • CHG: lockdown()- new third parameter, $mode to lock or unlock changed files. “lock” removes web write-access for changed files (updating from within web app) whereas “unlock” ensures files modified are always allowed write-access and files not in the set are locked (watch)
  • CHG: support CLI command chaining delimited by \; (cmd)
  • CHG: fortify()- permit write-access to permitted files (webapp)
  • CHG: schedule_api_cmd() support command chaining supplied as an array of commands (pman)
  • CHG: no igbinary support on SG cache
  • CHG: adapt one-click version cache to use SG cache
  • CHG: trust local database listing when determining what database grants to apply (Transfer)
  • CHG: use domain_fs_path on 6.5+ platforms (overlayfs) (sql)
  • REM: Web Apps beta stage
  • REM: rfc1867 support, mandates file-based storage in PHP
  • REM: PHP 5.4
  • REM: IE9 support
  • REM: modal.js, tooltip.js – use builtin Bootstrap alternatives
  • REM: symlink new user on user rename shim (user)
  • REM: make challenge token static (Aliases)
  • REM: exception-driven flow. Most of the backend modules are not exception driven and dns should not be an exception (DNS)
  • REM: IS_SOAP is true DNS verification bypass (Aliases)
  • REM: Analytics nag
  • REM: misc_run(), use pman_run()
Launchpad 3.0 Released – New Theme. Easier Management. 334 Changes