#####################################################################
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#####################################################################
* debian/copyright
- Prompt for:
  - ofbiz admin password(s)
  - default email(ofbiztest@example.com)
  - install of demo or just seed data
* Auto-generate admin key/port
* Move demo data into separate package?
- module script for stopping/modifying/installing entity defs/data
- init script
+ purging of /var/foo/ofbiz dirs
  - /var/log/ofbiz, /var/cache/ofbiz
  + /var/lib/ofbiz is cleared, except for .bash_history
- purging of dpkg-statoverride values
* mod-jk installation(apache/apache2)
* debian/watch
* During install, force seed install, but allow demo or ext to be selected.
* During reconfigure, allow seed, demo, or ext to be selected.
* Verify that $MEMIF in the init script only contains -X
* Prompt for and replace the sequence id prefix in the entity engine.
