summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config-freebsd.hs2
-rw-r--r--debian/changelog87
-rw-r--r--debian/control6
-rw-r--r--doc/forum/Using_propellor_for_continers_only/comment_3_cd4b9b9e160469e9f0b105f6c40a4ef8._comment54
-rw-r--r--doc/forum/Using_propellor_for_continers_only/comment_4_9dc985b26c29b9ce21e6c75ec03f6262._comment21
-rw-r--r--doc/forum/Using_propellor_for_continers_only/comment_5_8552ce821f5a3b386cb9e6ad417670ec._comment8
-rw-r--r--doc/haskell_newbie.mdwn2
-rw-r--r--doc/news/version_3.2.3.mdwn9
-rw-r--r--doc/news/version_3.3.0.mdwn26
-rw-r--r--doc/news/version_4.0.3.mdwn6
-rw-r--r--doc/news/version_4.3.1.mdwn4
-rw-r--r--doc/news/version_4.3.2.mdwn3
-rw-r--r--doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn11
-rw-r--r--doc/todo/spin_failure_HEAD.mdwn127
-rw-r--r--joeyconfig.hs118
-rw-r--r--privdata/.joeyconfig/privdata.gpg2893
-rw-r--r--propellor.cabal29
-rw-r--r--src/Propellor/Bootstrap.hs11
-rw-r--r--src/Propellor/Engine.hs56
-rw-r--r--src/Propellor/Gpg.hs2
-rw-r--r--src/Propellor/Info.hs4
-rw-r--r--src/Propellor/Message.hs27
-rw-r--r--src/Propellor/Property.hs15
-rw-r--r--src/Propellor/Property/Apache.hs8
-rw-r--r--src/Propellor/Property/Apt/PPA.hs3
-rw-r--r--src/Propellor/Property/Bootstrap.hs15
-rw-r--r--src/Propellor/Property/Chroot.hs20
-rw-r--r--src/Propellor/Property/ConfFile.hs11
-rw-r--r--src/Propellor/Property/DiskImage.hs144
-rw-r--r--src/Propellor/Property/DiskImage/PartSpec.hs8
-rw-r--r--src/Propellor/Property/Docker.hs12
-rw-r--r--src/Propellor/Property/File.hs50
-rw-r--r--src/Propellor/Property/FreeDesktop.hs29
-rw-r--r--src/Propellor/Property/Grub.hs18
-rw-r--r--src/Propellor/Property/HostingProvider/Linode.hs5
-rw-r--r--src/Propellor/Property/Hostname.hs2
-rw-r--r--src/Propellor/Property/LightDM.hs3
-rw-r--r--src/Propellor/Property/Sbuild.hs4
-rw-r--r--src/Propellor/Property/SiteSpecific/JoeySites.hs27
-rw-r--r--src/Propellor/Property/Systemd.hs2
-rw-r--r--src/Propellor/Property/User.hs8
-rw-r--r--src/Propellor/Property/XFCE.hs41
-rw-r--r--src/Propellor/Property/ZFS/Process.hs3
-rw-r--r--src/Propellor/Protocol.hs10
-rw-r--r--src/Propellor/Spin.hs102
-rw-r--r--src/Propellor/Ssh.hs18
-rw-r--r--src/Propellor/Types/Bootloader.hs12
-rw-r--r--src/Propellor/Types/Dns.hs8
-rw-r--r--src/Propellor/Types/OS.hs2
-rw-r--r--src/Propellor/Types/ZFS.hs4
-rw-r--r--src/Utility/DataUnits.hs8
-rw-r--r--src/Utility/FileMode.hs22
-rw-r--r--src/Utility/FileSystemEncoding.hs41
-rw-r--r--src/Utility/LinuxMkLibs.hs2
-rw-r--r--src/Utility/PartialPrelude.hs2
-rw-r--r--src/Utility/Path.hs32
-rw-r--r--src/Utility/Process.hs28
-rw-r--r--src/Utility/SafeCommand.hs4
-rw-r--r--src/Utility/Scheduled.hs2
-rw-r--r--src/Utility/Split.hs30
-rw-r--r--src/Utility/Tuple.hs17
61 files changed, 2419 insertions, 1859 deletions
diff --git a/config-freebsd.hs b/config-freebsd.hs
index 80abb89d..34880113 100644
--- a/config-freebsd.hs
+++ b/config-freebsd.hs
@@ -59,7 +59,7 @@ linuxbox = host "linuxbox.example.com" $ props
-- A generic webserver in a Docker container.
webserverContainer :: Docker.Container
webserverContainer = Docker.container "webserver" (Docker.latestImage "debian") $ props
- & osDebian' KFreeBSD (Stable "jessie") X86_64
+ & osDebian' KFreeBSD (Stable "stretch") X86_64
& Apt.stdSourcesList
& Docker.publish "80:80"
& Docker.volume "/var/www:/var/www"
diff --git a/debian/changelog b/debian/changelog
index 43e3cd6f..2efdf5cc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,9 +1,92 @@
-propellor (4.0.4) UNRELEASED; urgency=medium
+propellor (4.3.2) unstable; urgency=medium
+
+ * Really include Propellor.Property.FreeDesktop.
+
+ -- Joey Hess <id@joeyh.name> Thu, 06 Jul 2017 17:28:53 -0400
+
+propellor (4.3.1) unstable; urgency=medium
+
+ * Added Propellor.Property.FreeDesktop module.
+ * Added reservedSpacePercentage to the PartSpec EDSL.
+
+ -- Joey Hess <id@joeyh.name> Thu, 06 Jul 2017 17:03:15 -0400
+
+propellor (4.3.0) unstable; urgency=medium
+
+ * DiskImage: Removed grubBooted; properties that used to need it as a
+ parameter now look at Info about the bootloader that is installed in
+ the chroot that the disk image is created from.
+ (API change)
+
+ -- Joey Hess <id@joeyh.name> Wed, 05 Jul 2017 21:04:04 -0400
+
+propellor (4.2.0) unstable; urgency=medium
+
+ * DiskImage.grubBooted no longer takes a BIOS parameter,
+ and no longer implicitly adds Grub.installed to the properties of
+ the disk image. If you used DiskImage.grubBooted, you'll need to update
+ your propellor configuration, removing the BIOS parameter from
+ grubBooted and adding a Grub.installed property to the disk image, eg:
+ & Grub.installed PC
+ (API change)
+ * Grub.installed: Avoid running update-grub when used in a chroot, since
+ it will get confused.
+ * DiskImage.Finalization: Simplified this type since it does not need to
+ be used to install packages anymore. (API change)
+
+ -- Joey Hess <id@joeyh.name> Wed, 05 Jul 2017 18:10:49 -0400
+
+propellor (4.1.0) unstable; urgency=medium
+
+ * User.hasInsecurePassword makes sure shadow passwords are enabled,
+ so if the insecure password is later changed, the new password won't be
+ exposed.
+ * Bugfix: Apache.httpsVirtualHost' must create ssl/hn/ dir earlier
+ Thanks, Sean Whitton.
+ * Bootstrap.clonedFrom: Fix bug that broke copying .git/config into
+ chroot.
+ * Diskimage.imageExists: Align disk image size to multiple of 4096
+ sector size, since some programs (such as VBoxManage convertdd)
+ refuse to operate on disk images not aligned to a sector size.
+ * Bootstrap.bootstrappedFrom: Fix bug that caused propellor to only
+ be built from the bootstrapped config the first time.
+ * Bootstrap.bootstrappedFrom: Avoid doing anything when not run in a
+ chroot.
+ * When provisioning a container, output was buffered until the whole
+ process was done; now output will be displayed immediately.
+ * LightDM.autoLogin: Make it require LightDM.installed.
+ (minor API change as the type changed)
+ * Propellor.Property.XFCE added with some useful properties for the
+ desktop environment.
+ * Added File.applyPath property.
+ * Added File.checkOverwrite.
+ * File.isCopyOf: Fix bug that prevented this property from working
+ when the destination file did not yet exist.
+
+ -- Joey Hess <id@joeyh.name> Wed, 05 Jul 2017 17:30:00 -0400
+
+propellor (4.0.6) unstable; urgency=medium
+
+ * Fix bug that sometimes made --spin fail with
+ "fatal: Couldn't find remote ref HEAD"
+ * Display error and warning messages to stderr, not stdout.
+
+ -- Joey Hess <id@joeyh.name> Sun, 18 Jun 2017 19:30:50 -0400
+
+propellor (4.0.5) unstable; urgency=medium
+
+ * Switch cabal file from Extensions to Default-Extensions to fix
+ new picky hackage rejection.
+
+ -- Joey Hess <id@joeyh.name> Sat, 03 Jun 2017 15:07:36 -0400
+
+propellor (4.0.4) unstable; urgency=medium
* Propellor.Property.Restic added for yet another backup program.
Thanks, Félix Sipma.
+ * Removed dependency on MissingH, instead depends on split and hashable.
- -- Joey Hess <id@joeyh.name> Thu, 27 Apr 2017 16:31:26 -0400
+ -- Joey Hess <id@joeyh.name> Sat, 03 Jun 2017 14:56:44 -0400
propellor (4.0.3) unstable; urgency=medium
diff --git a/debian/control b/debian/control
index 289e663b..e6819060 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Build-Depends:
ghc (>= 7.6),
cabal-install,
libghc-async-dev,
- libghc-missingh-dev,
+ libghc-split-dev,
libghc-hslogger-dev,
libghc-unix-compat-dev,
libghc-ansi-terminal-dev,
@@ -18,6 +18,7 @@ Build-Depends:
libghc-exceptions-dev (>= 0.6),
libghc-stm-dev,
libghc-text-dev,
+ libghc-hashable-dev,
libghc-concurrent-output-dev,
Maintainer: Joey Hess <id@joeyh.name>
Standards-Version: 3.9.8
@@ -31,7 +32,7 @@ Depends: ${misc:Depends}, ${shlibs:Depends},
ghc (>= 7.4),
cabal-install,
libghc-async-dev,
- libghc-missingh-dev,
+ libghc-split-dev,
libghc-hslogger-dev,
libghc-unix-compat-dev,
libghc-ansi-terminal-dev,
@@ -42,6 +43,7 @@ Depends: ${misc:Depends}, ${shlibs:Depends},
libghc-exceptions-dev (>= 0.6),
libghc-stm-dev,
libghc-text-dev,
+ libghc-hashable-dev,
libghc-concurrent-output-dev,
git,
Description: property-based host configuration management in haskell
diff --git a/doc/forum/Using_propellor_for_continers_only/comment_3_cd4b9b9e160469e9f0b105f6c40a4ef8._comment b/doc/forum/Using_propellor_for_continers_only/comment_3_cd4b9b9e160469e9f0b105f6c40a4ef8._comment
new file mode 100644
index 00000000..fceeedcf
--- /dev/null
+++ b/doc/forum/Using_propellor_for_continers_only/comment_3_cd4b9b9e160469e9f0b105f6c40a4ef8._comment
@@ -0,0 +1,54 @@
+[[!comment format=mdwn
+ username="bardur.arantsson"
+ avatar="http://cdn.libravatar.org/avatar/a0be0039b44d33262b7ae650a0803ad5"
+ subject="comment 3"
+ date="2017-05-12T06:50:49Z"
+ content="""
+Ok, so I've tried to use this to build a Chroot (a reasonable starting point for building containers), using the following program:
+
+ module Main
+ ( main
+ ) where
+
+ import Propellor
+ import Propellor.Engine
+ import Propellor.Property.DiskImage
+ import qualified Propellor.Property.Apt as Apt
+ import qualified Propellor.Property.User as User
+ import Propellor.Property.Chroot
+
+ main :: IO ()
+ main = mainProperties $ host \"whatever\" $ props
+ & provisioned (mychroot \"out\")
+ where
+ mychroot d = debootstrapped mempty d $ props
+ & osDebian Unstable X86_64
+ & Apt.installed [\"linux-image-amd64\"]
+ & User.hasPassword (User \"root\")
+ & User.accountFor (User \"demo\")
+ & User.hasPassword (User \"demo\")
+
+It seems that \"debootstrap\" finishes:
+
+ I: Configuring apt-transport-https...
+ I: Configuring tasksel...
+ I: Configuring tasksel-data...
+ I: Configuring libc-bin...
+ I: Configuring systemd...
+ I: Configuring ca-certificates...
+ I: Base system installed successfully.
+
+But fails immediately afterwards:
+
+ ldd: /usr/local/propellor/propellor: No such file or directory
+ ** warning: user error (ldd [\"/usr/local/propellor/propellor\"] exited 1)
+ whatever chroot out exists ... failed
+ whatever overall ... failed
+
+(I should probably have used a different hostname than \"whatever\", but... whatever :).)
+
+So it seems that the chroot support still expects propellor to be installed on the host system?
+
+I should mention that I've done an extremely small patch to Propellor locally, just to the ChrootBootstrapper instance for ArchLinux to allow it to call debootstrap on Arch Linux -- it seems to exist as a package these days, not sure if it did when that Propellor code was written. Anyway...
+
+"""]]
diff --git a/doc/forum/Using_propellor_for_continers_only/comment_4_9dc985b26c29b9ce21e6c75ec03f6262._comment b/doc/forum/Using_propellor_for_continers_only/comment_4_9dc985b26c29b9ce21e6c75ec03f6262._comment
new file mode 100644
index 00000000..72d7ca83
--- /dev/null
+++ b/doc/forum/Using_propellor_for_continers_only/comment_4_9dc985b26c29b9ce21e6c75ec03f6262._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 4"""
+ date="2017-05-13T17:42:41Z"
+ content="""
+The way propellor handles running in a chroot or container is it exports
+its binary and support files into the container. This way the
+haskell code can run in a container, rather than being limited to
+only running shell commands in the container, and without needing ghc in
+the container.
+
+It does use the hardcoded `localdir` for that.
+It would certianly be possible to make it use propellor in a different
+location, perhaps using `getExecutablePath`.
+
+Since the git-annex outside the container passes command-line options to
+the one running inside the container to tell it what to do, using
+`mainProperties` would also not work since that does not look at
+command-line options. It would need to use `defaultMain` or
+`processCmdLine` and dispatch itself, or something..
+"""]]
diff --git a/doc/forum/Using_propellor_for_continers_only/comment_5_8552ce821f5a3b386cb9e6ad417670ec._comment b/doc/forum/Using_propellor_for_continers_only/comment_5_8552ce821f5a3b386cb9e6ad417670ec._comment
new file mode 100644
index 00000000..0d9904c5
--- /dev/null
+++ b/doc/forum/Using_propellor_for_continers_only/comment_5_8552ce821f5a3b386cb9e6ad417670ec._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="bardur.arantsson"
+ avatar="http://cdn.libravatar.org/avatar/a0be0039b44d33262b7ae650a0803ad5"
+ subject="comment 5"
+ date="2017-05-25T06:13:14Z"
+ content="""
+I'm not sure I understand all of that, but it sounds like I'll be fighting an uphill battle :). Maybe I'll try something shake-based instead. Thanks for the help.
+"""]]
diff --git a/doc/haskell_newbie.mdwn b/doc/haskell_newbie.mdwn
index dc3c54a7..8f3b60cf 100644
--- a/doc/haskell_newbie.mdwn
+++ b/doc/haskell_newbie.mdwn
@@ -53,7 +53,7 @@ mylaptop = host "mylaptop.example.com" $ props
myserver :: Host
myserver = host "server.example.com" $ props
- & osDebian (Stable "jessie") X86_64
+ & osDebian (Stable "stretch") X86_64
& Apt.stdSourcesList
& Apt.installed ["ssh"]
"""]]
diff --git a/doc/news/version_3.2.3.mdwn b/doc/news/version_3.2.3.mdwn
deleted file mode 100644
index 3689a908..00000000
--- a/doc/news/version_3.2.3.mdwn
+++ /dev/null
@@ -1,9 +0,0 @@
-propellor 3.2.3 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Improve extraction of gpg secret key id list, to work with gpg 2.1.
- * The propellor wrapper checks if ./config.hs exists; if so it runs
- using the configuration in the current directory, rather than
- ~/.propellor/config.hs
- * Debootstap: Fix too tight permissions lock down of debootstrapped
- chroots, which prevented non-root users from doing anything in the
- chroot."""]] \ No newline at end of file
diff --git a/doc/news/version_3.3.0.mdwn b/doc/news/version_3.3.0.mdwn
deleted file mode 100644
index 19bd5664..00000000
--- a/doc/news/version_3.3.0.mdwn
+++ /dev/null
@@ -1,26 +0,0 @@
-propellor 3.3.0 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Arch Linux is now supported by Propellor!
- Thanks to Zihao Wang for this port.
- * Added Propellor.Property.Pacman for Arch's package manager.
- Maintained by Zihao Wang.
- * The types of some properties changed; eg from Property DebianLike
- to Property (DebianLike + ArchLinux). Also, DebianLike and Linux
- are no longer type synonyms; propellor now knows that Linux includes
- ArchLinux. This could require updates to code, so is a minor API change.
- * GHC's fileSystemEncoding is used for all String IO, to avoid
- encoding-related crashes in eg, Propellor.Property.File.
- * Add --build option to simply build config.hs.
- * More informative usage message. Thanks, Daniel Brooks
- * Tor.hiddenService' added to support multiple ports.
- Thanks, Félix Sipma.
- * Apt.noPDiffs added.
- Thanks, Sean Whitton.
- * stack.yaml: Compile with GHC 8.0.1 against lts-7.16.
- Thanks, Andrew Cowie.
- * Added Propellor.Property.File.configFileName and related functions
- to generate good filenames for config directories.
- * Added Apt.suiteAvailablePinned, Apt.pinnedTo.
- Thanks, Sean Whitton.
- * Added File.containsBlock
- Thanks, Sean Whitton."""]] \ No newline at end of file
diff --git a/doc/news/version_4.0.3.mdwn b/doc/news/version_4.0.3.mdwn
deleted file mode 100644
index eb467287..00000000
--- a/doc/news/version_4.0.3.mdwn
+++ /dev/null
@@ -1,6 +0,0 @@
-propellor 4.0.3 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Added Fstab.listed, Fstab.swap, and Mount.swapOn properties.
- Thanks, Daniel Brooks.
- * Added Propellor.Property.Bootstrap, which can be used to make
- disk images contain their own installation of propellor."""]] \ No newline at end of file
diff --git a/doc/news/version_4.3.1.mdwn b/doc/news/version_4.3.1.mdwn
new file mode 100644
index 00000000..5c07307d
--- /dev/null
+++ b/doc/news/version_4.3.1.mdwn
@@ -0,0 +1,4 @@
+propellor 4.3.1 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Added Propellor.Property.FreeDesktop module.
+ * Added reservedSpacePercentage to the PartSpec EDSL."""]] \ No newline at end of file
diff --git a/doc/news/version_4.3.2.mdwn b/doc/news/version_4.3.2.mdwn
new file mode 100644
index 00000000..1a85d2d4
--- /dev/null
+++ b/doc/news/version_4.3.2.mdwn
@@ -0,0 +1,3 @@
+propellor 4.3.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Really include Propellor.Property.FreeDesktop."""]] \ No newline at end of file
diff --git a/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn b/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
new file mode 100644
index 00000000..450416f2
--- /dev/null
+++ b/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
@@ -0,0 +1,11 @@
+The properties in `Sbuild.hs` should use apt-cacher-ng instead of a bind mount of `/var/cache/apt/archives`. This has at least three advantages:
+
+1. more than one instance of sbuild can run at once
+
+2. sbuild can run even if apt is doing something else with its cache
+
+3. the `piupartsConf` properties are no longer needed.
+
+--spwhitton
+
+[[!tag user/spwhitton]]
diff --git a/doc/todo/spin_failure_HEAD.mdwn b/doc/todo/spin_failure_HEAD.mdwn
new file mode 100644
index 00000000..f838e469
--- /dev/null
+++ b/doc/todo/spin_failure_HEAD.mdwn
@@ -0,0 +1,127 @@
+Seen recently on 2 hosts:
+
+ Sending privdata (73139 bytes) to kite.kitenet.net ... done
+ fatal: Couldn't find remote ref HEAD
+ propellor: <stdout>: hPutStr: illegal operation (handle is closed)
+ fatal: The remote end hung up unexpectedly
+ Sending git update to kite.kitenet.net ... failed
+
+Despite the error, HEAD seems to be updated to the commit that is being spun,
+but the rest of the propellor runs doesn't happen. --[[Joey]]
+
+> This was happening spinning kite at my Mom's, but not from home.
+
+> Earlier, it was happening spinning clam from home, when clam had debian
+> oldstable on it (new install).
+>
+> So, transient and/or network-related.. --[[Joey]]
+
+> > Happening again spinning kite over satelite, but not other hosts.
+> > I enabled propellor.debug, and here's what it showed on kite:
+
+ Sending privdata (73139 bytes) to kite.kitenet.net ... done
+ [2017-06-18 16:01:08 EDT] received marked PRIVDATA
+ [2017-06-18 16:01:08 EDT] requested marked GITPUSH
+ [2017-06-18 16:01:11 EDT] received marked GITPUSH
+ [2017-06-18 16:01:11 EDT] command line: GitPush 11 12
+ fatal: Couldn't find remote ref HEAD
+ propellor: <stdout>: hPutStr: illegal operation (handle is closed)
+ fatal: The remote end hung up unexpectedly
+ Sending git update to kite.kitenet.net ... failed
+
+> > Seem that what's failing is "git fetch" when propellor
+> > runs it with --upload-pack used to run propellor --gitpush.
+> >
+> > The "fatal: Couldn't find remote ref HEAD" comes from git fetch,
+> > I think when no HEAD is in the list of remote refs.
+> >
+> > The hPutStr error was a red herring; errorMessage was using
+> > outputConcurrent. After I fixed it to use errorConcurrent,
+> > it displayed the "git fetch from client failed" error message instead.
+> >
+> > Next step is probably to enable `GIT_TRACE_PACKET` debugging
+> > of the git fetch. I did so on kite, but then propellor --spin succeeded.
+> > Here's the debug output I got when it worked, for later comparison
+> > next time it fails. Note the HEAD ref is given first thing.
+
+<pre>
+Sending privdata (73139 bytes) to kite.kitenet.net ... done
+[2017-06-18 16:27:12 EDT] received marked PRIVDATA
+[2017-06-18 16:27:12 EDT] requested marked GITPUSH
+[2017-06-18 16:27:13 EDT] received marked GITPUSH
+[2017-06-18 16:27:13 EDT] command line: GitPush 11 12
+16:27:13.953638 pkt-line.c:80 packet: fetch< 3a3c8a731d169a2768dd243581803dcb7b275049 HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow deepen-since deepen-not deepen-relative no-progress include-tag multi_ack_detailed symref=HEAD:refs/heads/joeyconfig agent=git/2.11.0
+16:27:13.953781 pkt-line.c:80 packet: fetch< 86b077b7a21efd5484dfaeee3c31fc5f3c151f6c refs/heads/confpairs
+16:27:13.953789 pkt-line.c:80 packet: fetch< e03e4bf0f1e557f87d1fe7e01a6de7866296fce6 refs/heads/d-i
+16:27:13.953795 pkt-line.c:80 packet: fetch< 3a3c8a731d169a2768dd243581803dcb7b275049 refs/heads/joeyconfig
+16:27:13.953801 pkt-line.c:80 packet: fetch< ee56d3793be3a8c0c268d8afdc642ef92b879269 refs/heads/master
+16:27:13.953807 pkt-line.c:80 packet: fetch< 51be061c90ca7539d7f8b804007cd9942f316860 refs/heads/precompiled
+16:27:13.953812 pkt-line.c:80 packet: fetch< 48c0e1107ea4a89a22e71c1cba0bdc238d119a9f refs/heads/resourceconflict
+16:27:13.953818 pkt-line.c:80 packet: fetch< dbfac89a85485f8ca2107792a3ce964c06adefbf refs/heads/typed-os-requirements
+16:27:13.953823 pkt-line.c:80 packet: fetch< 96a4fcf180885788959d7dc136dbef544270fa81 refs/heads/wip-bytestring-privdata
+16:27:13.953829 pkt-line.c:80 packet: fetch< ee35c58303221ddb4c83c33eb12a52c59cd482c2 refs/remotes/abailly/master
+16:27:13.953834 pkt-line.c:80 packet: fetch< baf65fa9fff4b8451ba7f1ee129484723a8deb9b refs/remotes/db48x/fstab-swap
+16:27:13.953839 pkt-line.c:80 packet: fetch< 7d8f9dbf60f8ab345a75c4ee4f8c457d0fde5b43 refs/remotes/db48x/git-in-emtpy-directory
+16:27:13.953844 pkt-line.c:80 packet: fetch< 17abde8439d17d49676f549f357f45eb2adce868 refs/remotes/db48x/master
+16:27:13.953849 pkt-line.c:80 packet: fetch< de50503e4dbdea853e899f01e8828cf4f454dd57 refs/remotes/dgit/dgit/sid
+(omitted 300+ lines of refs)
+16:27:14.352945 pkt-line.c:80 packet: fetch< 0000
+From .
+ * branch HEAD -> FETCH_HEAD
+16:27:14.379922 pkt-line.c:80 packet: fetch> 0000
+Sending git update to kite.kitenet.net ... done
+</pre>
+
+> > Aha! My next spin failed again, with this debug:
+
+<pre>
+Sending privdata (73139 bytes) to kite.kitenet.net ... done
+[2017-06-18 16:31:15 EDT] received marked PRIVDATA
+[2017-06-18 16:31:15 EDT] requested marked GITPUSH
+[2017-06-18 16:31:16 EDT] received marked GITPUSH
+[2017-06-18 16:31:16 EDT] command line: GitPush 11 12
+16:31:16.361717 pkt-line.c:80 packet: fetch< 17abde8439d17d49676f549f357f45eb2adce868 refs/remotes/db48x/master
+<pre>
+
+> > So there's an actual protocol error here; the first 13 lines
+> > of git protocol were not sent.
+> >
+> > Question now is, where is the mangling happening?
+> >
+> > * Fairly sure it's not on the local side's sendGitUpdate,
+> > where "git upload-pack ." is simply run and fed over ssh.
+> > * Could be in gitPushHelper, perhaps it's failing to write
+> > some of the first lines somehow?
+> > * Could be something on the remote side is consuming stdin
+> > that is not supposed to, and eats some of the protocol.
+> >
+> >
+> > I added debug dumping to gitPushHelper, and it seems to be
+> > reading the same truncated data, so it seems the problem is not there.
+> >
+> > Aha! The problem comes from stdin/stdInput confusion here:
+
+ req NeedGitPush gitPushMarker $ \_ -> do
+ hin <- dup stdInput
+ hout <- dup stdOutput
+ hClose stdin
+ hClose stdout
+
+> > A line read from stdin just before the dup gets the first line of the protocol
+> > as expected. But reading from stdInput starts with a later line.
+> > Apparently data is being buffered in the stdin Handle, so gitPushHelper,
+> > which reads from the Fd, does not see it.
+> >
+> > Here's a simple test case. Feeding this 2 lines on stdin will
+> > print the first and then fail with "hGetLine: end of file".
+> > The second line is lost in the buffer. This test case behaves
+> > like that reliably, so I'm surprised propellor only fails sometimes.
+
+ main = do
+ l <- hGetLine stdin
+ print l
+ bob <- fdToHandle stdInput
+ l2 <- hGetLine bob
+ print l2
+
+> > [[fixed|done]] --[[Joey]]
diff --git a/joeyconfig.hs b/joeyconfig.hs
index 6afaf76d..9ea6efea 100644
--- a/joeyconfig.hs
+++ b/joeyconfig.hs
@@ -26,7 +26,6 @@ import qualified Propellor.Property.Obnam as Obnam
import qualified Propellor.Property.Gpg as Gpg
import qualified Propellor.Property.Systemd as Systemd
import qualified Propellor.Property.Journald as Journald
-import qualified Propellor.Property.Chroot as Chroot
import qualified Propellor.Property.Fail2Ban as Fail2Ban
import qualified Propellor.Property.Aiccu as Aiccu
import qualified Propellor.Property.OS as OS
@@ -37,8 +36,6 @@ import qualified Propellor.Property.SiteSpecific.GitHome as GitHome
import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder
import qualified Propellor.Property.SiteSpecific.Branchable as Branchable
import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites
-import Propellor.Property.DiskImage
-import Propellor.Property.Bootstrap
main :: IO () -- _ ______`| ,-.__
main = defaultMain hosts -- / \___-=O`/|O`/__| (____.'
@@ -48,15 +45,15 @@ hosts :: [Host] -- * \ | | '--------'
hosts = -- (o) `
[ darkstar
, gnu
+ , dragon
, clam
- , mayfly
- , oyster
, orca
, baleen
, honeybee
, kite
, elephant
, beaver
+ , mouse
, pell
, keysafe
] ++ monsters
@@ -72,7 +69,7 @@ testvm = host "testvm.kitenet.net" $ props
& Apt.installed ["ssh"]
& User.hasPassword (User "root")
where
- postinstall :: Property DebianLike
+ postinstall :: Property (HasInfo + DebianLike)
postinstall = propertyList "fixing up after clean install" $ props
& OS.preserveRootSshAuthorized
& OS.preserveResolvConf
@@ -86,39 +83,29 @@ darkstar = host "darkstar.kitenet.net" $ props
& ipv6 "2001:4830:1600:187::2"
& Aiccu.hasConfig "T18376" "JHZ2-SIXXS"
- & Apt.buildDep ["git-annex"] `period` Daily
-
& JoeySites.dkimMilter
- & JoeySites.alarmClock "*-*-* 7:30" (User "joey")
- "/usr/bin/timeout 45m /home/joey/bin/goodmorning"
+ & JoeySites.postfixSaslPasswordClient
+ -- & JoeySites.alarmClock "*-*-* 7:30" (User "joey")
+ -- "/usr/bin/timeout 45m /home/joey/bin/goodmorning"
& Ssh.userKeys (User "joey") hostContext
[ (SshRsa, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1YoyHxZwG5Eg0yiMTJLSWJ/+dMM6zZkZiR4JJ0iUfP+tT2bm/lxYompbSqBeiCq+PYcSC67mALxp1vfmdOV//LWlbXfotpxtyxbdTcQbHhdz4num9rJQz1tjsOsxTEheX5jKirFNC5OiKhqwIuNydKWDS9qHGqsKcZQ8p+n1g9Lr3nJVGY7eRRXzw/HopTpwmGmAmb9IXY6DC2k91KReRZAlOrk0287LaK3eCe1z0bu7LYzqqS+w99iXZ/Qs0m9OqAPnHZjWQQ0fN4xn5JQpZSJ7sqO38TBAimM+IHPmy2FTNVVn9zGM+vN1O2xr3l796QmaUG1+XLL0shfR/OZbb joey@darkstar")
]
- & imageBuilt "/srv/propellor-disk.img" c MSDOS (grubBooted PC)
- [ partition EXT2 `mountedAt` "/boot"
- `setFlag` BootFlag
- , partition EXT4 `mountedAt` "/"
- `mountOpt` errorReadonly
- , swapPartition (MegaBytes 256)
- ]
- where
- c d = Chroot.debootstrapped mempty d $ props
- & osDebian Unstable X86_64
- & Hostname.setTo "demo"
- & Apt.installed ["linux-image-amd64"]
- & User "root" `User.hasInsecurePassword` "root"
- & bootstrappedFrom GitRepoOutsideChroot
-
gnu :: Host
gnu = host "gnu.kitenet.net" $ props
- & Apt.buildDep ["git-annex"] `period` Daily
+ & Postfix.satellite
+
+dragon :: Host
+dragon = host "dragon.kitenet.net" $ props
+ & ipv6 "2001:4830:1600:187::2"
+ & JoeySites.dkimMilter
+ & JoeySites.postfixSaslPasswordClient
clam :: Host
clam = host "clam.kitenet.net" $ props
& standardSystem Unstable X86_64
["Unreliable server. Anything here may be lost at any time!" ]
- & ipv4 "167.88.41.194"
+ & ipv4 "64.137.239.3"
& CloudAtCost.decruft
& Ssh.hostKeys hostContext
@@ -127,7 +114,6 @@ clam = host "clam.kitenet.net" $ props
, (SshEcdsa, "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPhfvcOuw0Yt+MnsFc4TI2gWkKi62Eajxz+TgbHMO/uRTYF8c5V8fOI3o+J/3m5+lT0S5o8j8a7xIC3COvi+AVw=")
]
& Apt.unattendedUpgrades
- & Network.ipv6to4
& Systemd.persistentJournal
& Journald.systemMaxUse "50MiB"
@@ -141,47 +127,6 @@ clam = host "clam.kitenet.net" $ props
& alias "scroll.joeyh.name"
& alias "us.scroll.joeyh.name"
-mayfly :: Host
-mayfly = host "mayfly.kitenet.net" $ props
- & standardSystem (Stable "jessie") X86_64
- [ "Scratch VM. Contents can change at any time!" ]
- & ipv4 "167.88.36.193"
-
- & CloudAtCost.decruft
- & Apt.unattendedUpgrades
- & Network.ipv6to4
- & Systemd.persistentJournal
- & Journald.systemMaxUse "500MiB"
-
- & Tor.isRelay
- & Tor.named "kite3"
- & Tor.bandwidthRate (Tor.PerMonth "400 GB")
-
-oyster :: Host
-oyster = host "oyster.kitenet.net" $ props
- & standardSystem Unstable X86_64
- [ "Unreliable server. Anything here may be lost at any time!" ]
- & ipv4 "64.137.179.21"
-
- & CloudAtCost.decruft
- & Ssh.hostKeys hostContext
- [ (SshEcdsa, "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBP0ws/IxQegVU0RhqnIm5A/vRSPTO70wD4o2Bd1jL970dTetNyXzvWGe1spEbLjIYSLIO7WvOBSE5RhplBKFMUU=")
- ]
- & Apt.unattendedUpgrades
- & Network.ipv6to4
- & Systemd.persistentJournal
- & Journald.systemMaxUse "500MiB"
- & Apt.serviceInstalledRunning "swapspace"
-
- & Tor.isRelay
- & Tor.named "kite4"
- & Tor.bandwidthRate (Tor.PerMonth "400 GB")
-
- -- Nothing is using http port 80, so listen on
- -- that port for ssh, for traveling on bad networks that
- -- block 22.
- & Ssh.listenPort (Port 80)
-
baleen :: Host
baleen = host "baleen.kitenet.net" $ props
& standardSystem Unstable X86_64 [ "New git-annex build box." ]
@@ -286,6 +231,8 @@ kite = host "kite.kitenet.net" $ props
& Journald.systemMaxUse "500MiB"
& Ssh.passwordAuthentication True
& Fail2Ban.installed -- since ssh password authentication is allowed
+ -- Allow ssh -R to forward ports via kite
+ & Ssh.setSshdConfig "GatewayPorts" "clientspecified"
& Apt.serviceInstalledRunning "ntp"
& "/etc/timezone" `File.hasContent` ["US/Eastern"]
@@ -356,7 +303,10 @@ kite = host "kite.kitenet.net" $ props
& JoeySites.oldUseNetServer hosts
& alias "ns4.kitenet.net"
- & myDnsPrimary True "kitenet.net" []
+ & myDnsPrimary True "kitenet.net"
+ [ (RelDomain "mouse-onion", CNAME $ AbsDomain "htieo6yu2qtcn2j3.onion")
+ , (RelDomain "beaver-onion", CNAME $ AbsDomain "tl4xsvaxryjylgxs.onion")
+ ]
& myDnsPrimary True "joeyh.name" []
& myDnsPrimary True "ikiwiki.info" []
& myDnsPrimary True "olduse.net"
@@ -366,6 +316,10 @@ kite = host "kite.kitenet.net" $ props
& branchableSecondary
& Dns.secondaryFor ["animx"] hosts "animx.eu.org"
+ & alias "debug-me.joeyh.name"
+ -- debug-me installed manually until package is available
+ & Systemd.enabled "debug-me"
+
-- testing
& Apache.httpsVirtualHost "letsencrypt.joeyh.name" "/var/www/html"
(LetsEncrypt.AgreeTOS (Just "id@joeyh.name"))
@@ -441,15 +395,23 @@ elephant = host "elephant.kitenet.net" $ props
beaver :: Host
beaver = host "beaver.kitenet.net" $ props
& ipv6 "2001:4830:1600:195::2"
- & Apt.serviceInstalledRunning "aiccu"
& Apt.installed ["ssh"]
& Ssh.hostPubKey SshDsa "ssh-dss AAAAB3NzaC1kc3MAAACBAIrLX260fY0Jjj/p0syNhX8OyR8hcr6feDPGOj87bMad0k/w/taDSOzpXe0Wet7rvUTbxUjH+Q5wPd4R9zkaSDiR/tCb45OdG6JsaIkmqncwe8yrU+pqSRCxttwbcFe+UU+4AAcinjVedZjVRDj2rRaFPc9BXkPt7ffk8GwEJ31/AAAAFQCG/gOjObsr86vvldUZHCteaJttNQAAAIB5nomvcqOk/TD07DLaWKyG7gAcW5WnfY3WtnvLRAFk09aq1EuiJ6Yba99Zkb+bsxXv89FWjWDg/Z3Psa22JMyi0HEDVsOevy/1sEQ96AGH5ijLzFInfXAM7gaJKXASD7hPbVdjySbgRCdwu0dzmQWHtH+8i1CMVmA2/a5Y/wtlJAAAAIAUZj2US2D378jBwyX1Py7e4sJfea3WSGYZjn4DLlsLGsB88POuh32aOChd1yzF6r6C2sdoPBHQcWBgNGXcx4gF0B5UmyVHg3lIX2NVSG1ZmfuLNJs9iKNu4cHXUmqBbwFYQJBvB69EEtrOw4jSbiTKwHFmqdA/mw1VsMB+khUaVw=="
+ & Tor.installed
+ & Tor.hiddenServiceAvailable "ssh" (Port 22)
& alias "usbackup.kitenet.net"
& JoeySites.backupsBackedupFrom hosts "eubackup.kitenet.net" "/home/joey/lib/backup"
& Apt.serviceInstalledRunning "anacron"
& Cron.niceJob "system disk backed up" Cron.Weekly (User "root") "/"
"rsync -a -x / /home/joey/lib/backup/beaver.kitenet.net/"
+mouse :: Host
+mouse = host "mouse.kitenet.net" $ props
+ & ipv4 "67.223.19.96"
+ & Apt.installed ["ssh"]
+ & Tor.installed
+ & Tor.hiddenServiceAvailable "ssh" (Port 22)
+
-- Branchable is not completely deployed with propellor yet.
pell :: Host
pell = host "pell.branchable.com" $ props
@@ -472,6 +434,7 @@ pell = host "pell.branchable.com" $ props
& alias "dist-bugs.kitenet.net"
& alias "family.kitenet.net"
+ & osDebian (Stable "jessie") X86_64
& Apt.installed ["linux-image-amd64"]
& Apt.unattendedUpgrades
& Branchable.server hosts
@@ -482,7 +445,7 @@ keysafe :: Host
keysafe = host "keysafe.joeyh.name" $ props
& ipv4 "139.59.17.168"
& Hostname.sane
- & osDebian (Stable "jessie") X86_64
+ & osDebian (Stable "stretch") X86_64
& Apt.stdSourcesList `onChange` Apt.upgrade
& Apt.unattendedUpgrades
& DigitalOcean.distroKernel
@@ -542,7 +505,7 @@ keysafe = host "keysafe.joeyh.name" $ props
-- and administrative sanity.
openidProvider :: Systemd.Container
openidProvider = Systemd.debContainer "openid-provider" $ props
- & standardContainer (Stable "jessie")
+ & standardContainer (Stable "stretch")
& alias hn
& OpenId.providerFor [User "joey", User "liw"] hn (Just (Port 8081))
where
@@ -551,7 +514,7 @@ openidProvider = Systemd.debContainer "openid-provider" $ props
-- Exhibit: kite's 90's website on port 1994.
ancientKitenet :: Systemd.Container
ancientKitenet = Systemd.debContainer "ancient-kitenet" $ props
- & standardContainer (Stable "jessie")
+ & standardContainer (Stable "stretch")
& alias hn
& Git.cloned (User "root") "git://kitenet-net.branchable.com/" "/var/www/html"
(Just "remotes/origin/old-kitenet.net")
@@ -565,13 +528,13 @@ ancientKitenet = Systemd.debContainer "ancient-kitenet" $ props
oldusenetShellBox :: Systemd.Container
oldusenetShellBox = Systemd.debContainer "oldusenet-shellbox" $ props
- & standardContainer (Stable "jessie")
+ & standardContainer (Stable "stretch")
& alias "shell.olduse.net"
& JoeySites.oldUseNetShellBox
kiteShellBox :: Systemd.Container
kiteShellBox = Systemd.debContainer "kiteshellbox" $ props
- & standardContainer (Stable "jessie")
+ & standardContainer (Stable "stretch")
& JoeySites.kiteShellBox
type Motd = [String]
@@ -650,9 +613,6 @@ monsters = -- but do want to track their public keys etc.
& Ssh.hostPubKey SshEcdsa "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY="
, host "ns6.gandi.net" $ props
& ipv4 "217.70.177.40"
- , host "mouse.kitenet.net" $ props
- & ipv6 "2001:4830:1600:492::2"
- & ipv4 "67.223.19.96"
, host "animx" $ props
& ipv4 "76.7.162.186"
& ipv4 "76.7.162.187"
diff --git a/privdata/.joeyconfig/privdata.gpg b/privdata/.joeyconfig/privdata.gpg
index 9c6150d9..abcddba9 100644
--- a/privdata/.joeyconfig/privdata.gpg
+++ b/privdata/.joeyconfig/privdata.gpg
@@ -1,1436 +1,1463 @@
-----BEGIN PGP MESSAGE-----
-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
-SqnwqXgbrPQbnqnb
-=p9gn
+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
+V9VxK/RYRDYUqW+eGQMJk4X4ib+EQRTh
+=18+W
-----END PGP MESSAGE-----
diff --git a/propellor.cabal b/propellor.cabal
index a5ed5ed9..7d082807 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,5 +1,5 @@
Name: propellor
-Version: 4.0.3
+Version: 4.3.2
Cabal-Version: >= 1.20
License: BSD2
Maintainer: Joey Hess <id@joeyh.name>
@@ -36,46 +36,49 @@ Description:
It is configured using haskell.
Executable propellor
+ Default-Language: Haskell98
Main-Is: wrapper.hs
GHC-Options: -threaded -Wall -fno-warn-tabs -O0
if impl(ghc >= 8.0)
GHC-Options: -fno-warn-redundant-constraints
- Extensions: TypeOperators
+ Default-Extensions: TypeOperators
Hs-Source-Dirs: src
Build-Depends:
-- propellor needs to support the ghc shipped in Debian stable,
-- and also only depends on packages in Debian stable.
base >= 4.5, base < 5,
- MissingH, directory, filepath, IfElse, process, bytestring, hslogger,
+ directory, filepath, IfElse, process, bytestring, hslogger, split,
unix, unix-compat, ansi-terminal, containers (>= 0.5), network, async,
- time, mtl, transformers, exceptions (>= 0.6), stm, text
+ time, mtl, transformers, exceptions (>= 0.6), stm, text, hashable
Other-Modules:
Propellor.DotDir
Executable propellor-config
+ Default-Language: Haskell98
Main-Is: config.hs
GHC-Options: -threaded -Wall -fno-warn-tabs -O0
if impl(ghc >= 8.0)
GHC-Options: -fno-warn-redundant-constraints
- Extensions: TypeOperators
+ Default-Extensions: TypeOperators
Hs-Source-Dirs: src
Build-Depends:
base >= 4.5, base < 5,
- MissingH, directory, filepath, IfElse, process, bytestring, hslogger,
+ directory, filepath, IfElse, process, bytestring, hslogger, split,
unix, unix-compat, ansi-terminal, containers (>= 0.5), network, async,
- time, mtl, transformers, exceptions (>= 0.6), stm, text
+ time, mtl, transformers, exceptions (>= 0.6), stm, text, hashable
Library
+ Default-Language: Haskell98
GHC-Options: -Wall -fno-warn-tabs -O0
if impl(ghc >= 8.0)
GHC-Options: -fno-warn-redundant-constraints
- Extensions: TypeOperators
+ Default-Extensions: TypeOperators
Hs-Source-Dirs: src
Build-Depends:
base >= 4.5, base < 5,
- MissingH, directory, filepath, IfElse, process, bytestring, hslogger,
+ directory, filepath, IfElse, process, bytestring, hslogger, split,
unix, unix-compat, ansi-terminal, containers (>= 0.5), network, async,
- time, mtl, transformers, exceptions (>= 0.6), stm, text
+ time, mtl, transformers, exceptions (>= 0.6), stm, text, hashable
Exposed-Modules:
Propellor
@@ -111,6 +114,7 @@ Library
Propellor.Property.FreeBSD
Propellor.Property.FreeBSD.Pkg
Propellor.Property.FreeBSD.Poudriere
+ Propellor.Property.FreeDesktop
Propellor.Property.Fstab
Propellor.Property.Git
Propellor.Property.Gpg
@@ -150,6 +154,7 @@ Library
Propellor.Property.Unbound
Propellor.Property.User
Propellor.Property.Uwsgi
+ Propellor.Property.XFCE
Propellor.Property.ZFS
Propellor.Property.ZFS.Process
Propellor.Property.ZFS.Properties
@@ -173,6 +178,7 @@ Library
Propellor.EnsureProperty
Propellor.Exception
Propellor.Types
+ Propellor.Types.Bootloader
Propellor.Types.ConfigurableValue
Propellor.Types.Core
Propellor.Types.Chroot
@@ -222,10 +228,13 @@ Library
Utility.Process.NonConcurrent
Utility.SafeCommand
Utility.Scheduled
+ Utility.Scheduled
+ Utility.Split
Utility.SystemDirectory
Utility.Table
Utility.ThreadScheduler
Utility.Tmp
+ Utility.Tuple
Utility.UserInfo
System.Console.Concurrent
System.Console.Concurrent.Internal
diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs
index 29c55213..4b3f2da2 100644
--- a/src/Propellor/Bootstrap.hs
+++ b/src/Propellor/Bootstrap.hs
@@ -3,6 +3,8 @@ module Propellor.Bootstrap (
checkBinaryCommand,
installGitCommand,
buildPropellor,
+ checkDepsCommand,
+ buildCommand,
) where
import Propellor.Base
@@ -83,7 +85,7 @@ depsCommand msys = "( " ++ intercalate " ; " (concat [osinstall, cabalinstall])
, "ghc"
, "cabal-install"
, "libghc-async-dev"
- , "libghc-missingh-dev"
+ , "libghc-split-dev"
, "libghc-hslogger-dev"
, "libghc-unix-compat-dev"
, "libghc-ansi-terminal-dev"
@@ -94,13 +96,14 @@ depsCommand msys = "( " ++ intercalate " ; " (concat [osinstall, cabalinstall])
, "libghc-exceptions-dev"
, "libghc-stm-dev"
, "libghc-text-dev"
+ , "libghc-hashable-dev"
]
fbsddeps =
[ "gnupg"
, "ghc"
, "hs-cabal-install"
, "hs-async"
- , "hs-MissingH"
+ , "hs-split"
, "hs-hslogger"
, "hs-unix-compat"
, "hs-ansi-terminal"
@@ -111,13 +114,14 @@ depsCommand msys = "( " ++ intercalate " ; " (concat [osinstall, cabalinstall])
, "hs-exceptions"
, "hs-stm"
, "hs-text"
+ , "hs-hashable"
]
archlinuxdeps =
[ "gnupg"
, "ghc"
, "cabal-install"
, "haskell-async"
- , "haskell-missingh"
+ , "haskell-split"
, "haskell-hslogger"
, "haskell-unix-compat"
, "haskell-ansi-terminal"
@@ -129,6 +133,7 @@ depsCommand msys = "( " ++ intercalate " ; " (concat [osinstall, cabalinstall])
, "haskell-exceptions"
, "haskell-stm"
, "haskell-text"
+ , "hashell-hashable"
]
installGitCommand :: Maybe System -> ShellCommand
diff --git a/src/Propellor/Engine.hs b/src/Propellor/Engine.hs
index 08f535e0..f54da929 100644
--- a/src/Propellor/Engine.hs
+++ b/src/Propellor/Engine.hs
@@ -8,6 +8,8 @@ module Propellor.Engine (
fromHost,
fromHost',
onlyProcess,
+ chainPropellor,
+ runChainPropellor,
) where
import System.Exit
@@ -17,7 +19,9 @@ import "mtl" Control.Monad.RWS.Strict
import System.PosixCompat
import System.Posix.IO
import System.FilePath
+import System.Console.Concurrent
import Control.Applicative
+import Control.Concurrent.Async
import Prelude
import Propellor.Types
@@ -28,6 +32,8 @@ import Propellor.Exception
import Propellor.Info
import Utility.Exception
import Utility.Directory
+import Utility.Process
+import Utility.PartialPrelude
-- | Gets the Properties of a Host, and ensures them all,
-- with nice display of what's being done.
@@ -96,3 +102,53 @@ onlyProcess lockfile a = bracket lock unlock (const a)
return l
unlock = closeFd
alreadyrunning = error "Propellor is already running on this host!"
+
+-- | Chains to a propellor sub-Process, forwarding its output on to the
+-- display, except for the last line which is a Result.
+chainPropellor :: CreateProcess -> IO Result
+chainPropellor p =
+ -- We want to use outputConcurrent to display output
+ -- as it's received. If only stdout were captured,
+ -- concurrent-output would buffer all outputConcurrent.
+ -- Also capturing stderr avoids that problem.
+ withOEHandles createProcessSuccess p $ \(outh, errh) -> do
+ (r, ()) <- processChainOutput outh
+ `concurrently` forwardChainError errh
+ return r
+
+-- | Reads and displays each line from the Handle, except for the last line
+-- which is a Result.
+processChainOutput :: Handle -> IO Result
+processChainOutput h = go Nothing
+ where
+ go lastline = do
+ v <- catchMaybeIO (hGetLine h)
+ case v of
+ Nothing -> case lastline of
+ Nothing -> do
+ return FailedChange
+ Just l -> case readish l of
+ Just r -> pure r
+ Nothing -> do
+ outputConcurrent (l ++ "\n")
+ return FailedChange
+ Just s -> do
+ outputConcurrent $
+ maybe "" (\l -> if null l then "" else l ++ "\n") lastline
+ go (Just s)
+
+forwardChainError :: Handle -> IO ()
+forwardChainError h = do
+ v <- catchMaybeIO (hGetLine h)
+ case v of
+ Nothing -> return ()
+ Just s -> do
+ errorConcurrent (s ++ "\n")
+ forwardChainError h
+
+-- | Used by propellor sub-Processes that are run by chainPropellor.
+runChainPropellor :: Host -> Propellor Result -> IO ()
+runChainPropellor h a = do
+ r <- runPropellor h a
+ flushConcurrentOutput
+ putStrLn $ "\n" ++ show r
diff --git a/src/Propellor/Gpg.hs b/src/Propellor/Gpg.hs
index 6ac153cc..43c4eddf 100644
--- a/src/Propellor/Gpg.hs
+++ b/src/Propellor/Gpg.hs
@@ -2,7 +2,6 @@ module Propellor.Gpg where
import System.IO
import Data.Maybe
-import Data.List.Utils
import Control.Monad
import Control.Applicative
import Prelude
@@ -18,6 +17,7 @@ import Utility.Misc
import Utility.Tmp
import Utility.Env
import Utility.Directory
+import Utility.Split
type KeyId = String
diff --git a/src/Propellor/Info.hs b/src/Propellor/Info.hs
index 49ca689f..ed6c2d85 100644
--- a/src/Propellor/Info.hs
+++ b/src/Propellor/Info.hs
@@ -84,13 +84,13 @@ askInfo = asks (fromInfo . hostInfo)
-- It also lets the type checker know that all the properties of the
-- host must support Debian.
--
--- > & osDebian (Stable "jessie") X86_64
+-- > & osDebian (Stable "stretch") X86_64
osDebian :: DebianSuite -> Architecture -> Property (HasInfo + Debian)
osDebian = osDebian' Linux
-- Use to specify a different `DebianKernel` than the default `Linux`
--
--- > & osDebian' KFreeBSD (Stable "jessie") X86_64
+-- > & osDebian' KFreeBSD (Stable "stretch") X86_64
osDebian' :: DebianKernel -> DebianSuite -> Architecture -> Property (HasInfo + Debian)
osDebian' kernel suite arch = tightenTargets $ os (System (Debian kernel suite) arch)
diff --git a/src/Propellor/Message.hs b/src/Propellor/Message.hs
index 97573516..7715088f 100644
--- a/src/Propellor/Message.hs
+++ b/src/Propellor/Message.hs
@@ -14,7 +14,6 @@ module Propellor.Message (
infoMessage,
errorMessage,
stopPropellorMessage,
- processChainOutput,
messagesDone,
createProcessConcurrent,
withConcurrentOutput,
@@ -31,7 +30,6 @@ import Prelude
import Propellor.Types
import Propellor.Types.Exception
-import Utility.PartialPrelude
import Utility.Monad
import Utility.Exception
@@ -102,7 +100,7 @@ actionMessage' mhn desc a = do
warningMessage :: MonadIO m => String -> m ()
warningMessage s = liftIO $
- outputConcurrent =<< colorLine Vivid Magenta ("** warning: " ++ s)
+ errorConcurrent =<< colorLine Vivid Magenta ("** warning: " ++ s)
infoMessage :: MonadIO m => [String] -> m ()
infoMessage ls = liftIO $ outputConcurrent $ concatMap (++ "\n") ls
@@ -113,7 +111,7 @@ infoMessage ls = liftIO $ outputConcurrent $ concatMap (++ "\n") ls
-- property fail. Propellor will continue to the next property.
errorMessage :: MonadIO m => String -> m a
errorMessage s = liftIO $ do
- outputConcurrent =<< colorLine Vivid Red ("** error: " ++ s)
+ errorConcurrent =<< colorLine Vivid Red ("** error: " ++ s)
-- Normally this exception gets caught and is not displayed,
-- and propellor continues. So it's only displayed if not
-- caught, and so we say, cannot continue.
@@ -142,27 +140,6 @@ colorLine intensity color msg = concat <$> sequence
, pure "\n"
]
--- | Reads and displays each line from the Handle, except for the last line
--- which is a Result.
-processChainOutput :: Handle -> IO Result
-processChainOutput h = go Nothing
- where
- go lastline = do
- v <- catchMaybeIO (hGetLine h)
- case v of
- Nothing -> case lastline of
- Nothing -> do
- return FailedChange
- Just l -> case readish l of
- Just r -> pure r
- Nothing -> do
- outputConcurrent (l ++ "\n")
- return FailedChange
- Just s -> do
- outputConcurrent $
- maybe "" (\l -> if null l then "" else l ++ "\n") lastline
- go (Just s)
-
-- | Called when all messages about properties have been printed.
messagesDone :: IO ()
messagesDone = outputConcurrent
diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs
index 94c82c9f..55e688ab 100644
--- a/src/Propellor/Property.hs
+++ b/src/Propellor/Property.hs
@@ -50,8 +50,9 @@ import Data.Monoid
import Control.Monad.IfElse
import "mtl" Control.Monad.RWS.Strict
import System.Posix.Files
-import qualified Data.Hash.MD5 as MD5
+import Data.Maybe
import Data.List
+import Data.Hashable
import Control.Applicative
import Prelude
@@ -64,8 +65,8 @@ import Propellor.Info
import Propellor.EnsureProperty
import Utility.Exception
import Utility.Monad
-import Utility.Misc
import Utility.Directory
+import Utility.Misc
-- | Makes a perhaps non-idempotent Property be idempotent by using a flag
-- file to indicate whether it has run before.
@@ -228,12 +229,12 @@ changesFile p f = checkResult getstat comparestat p
-- Changes to mtime etc that do not change file content are treated as
-- NoChange.
changesFileContent :: Checkable p i => p i -> FilePath -> Property i
-changesFileContent p f = checkResult getmd5 comparemd5 p
+changesFileContent p f = checkResult gethash comparehash p
where
- getmd5 = catchMaybeIO $ MD5.md5 . MD5.Str <$> readFileStrict f
- comparemd5 oldmd5 = do
- newmd5 <- getmd5
- return $ if oldmd5 == newmd5 then NoChange else MadeChange
+ gethash = catchMaybeIO $ hash <$> readFileStrict f
+ comparehash oldhash = do
+ newhash <- gethash
+ return $ if oldhash == newhash then NoChange else MadeChange
-- | Determines if the first file is newer than the second file.
--
diff --git a/src/Propellor/Property/Apache.hs b/src/Propellor/Property/Apache.hs
index 554a5837..854d0eaa 100644
--- a/src/Propellor/Property/Apache.hs
+++ b/src/Propellor/Property/Apache.hs
@@ -189,7 +189,7 @@ httpsVirtualHost' domain docroot letos addedcfg = setup <!> teardown
`requires` modEnabled "ssl"
`before` setuphttps
teardown = siteDisabled domain
- setuphttp = siteEnabled' domain $
+ setuphttp = (siteEnabled' domain $
-- The sslconffile is only created after letsencrypt gets
-- the cert. The "*" is needed to make apache not error
-- when the file doesn't exist.
@@ -201,23 +201,23 @@ httpsVirtualHost' domain docroot letos addedcfg = setup <!> teardown
, "RewriteRule ^/.well-known/(.*) - [L]"
-- Everything else redirects to https
, "RewriteRule ^/(.*) https://" ++ domain ++ "/$1 [L,R,NE]"
- ]
+ ])
+ `requires` File.dirExists (takeDirectory cf)
setuphttps = LetsEncrypt.letsEncrypt letos domain docroot
`onChange` postsetuphttps
postsetuphttps = combineProperties (domain ++ " ssl cert installed") $ props
- & File.dirExists (takeDirectory cf)
& File.hasContent cf sslvhost
`onChange` reloaded
-- always reload since the cert has changed
& reloaded
where
- cf = sslconffile "letsencrypt"
sslvhost = vhost (Port 443)
[ "SSLEngine on"
, "SSLCertificateFile " ++ LetsEncrypt.certFile domain
, "SSLCertificateKeyFile " ++ LetsEncrypt.privKeyFile domain
, "SSLCertificateChainFile " ++ LetsEncrypt.chainFile domain
]
+ cf = sslconffile "letsencrypt"
sslconffile s = "/etc/apache2/sites-available/ssl/" ++ domain ++ "/" ++ s ++ ".conf"
vhost p ls =
[ "<VirtualHost *:" ++ val p ++">"
diff --git a/src/Propellor/Property/Apt/PPA.hs b/src/Propellor/Property/Apt/PPA.hs
index 346125ff..a8f7db15 100644
--- a/src/Propellor/Property/Apt/PPA.hs
+++ b/src/Propellor/Property/Apt/PPA.hs
@@ -6,10 +6,11 @@ module Propellor.Property.Apt.PPA where
import Data.List
import Control.Applicative
import Prelude
-import Data.String.Utils
import Data.String (IsString(..))
+
import Propellor.Base
import qualified Propellor.Property.Apt as Apt
+import Utility.Split
-- | Ensure software-properties-common is installed.
installed :: Property DebianLike
diff --git a/src/Propellor/Property/Bootstrap.hs b/src/Propellor/Property/Bootstrap.hs
index 5678a865..767d6ef7 100644
--- a/src/Propellor/Property/Bootstrap.hs
+++ b/src/Propellor/Property/Bootstrap.hs
@@ -17,17 +17,17 @@ data RepoSource
-- | Bootstraps a propellor installation into
-- /usr/local/propellor/
--
--- Normally, propellor is already bootstrapped when it runs, so this
--- property is not useful. However, this can be useful inside a
--- chroot used to build a disk image, to make the disk image
--- have propellor installed.
+-- This property only does anything when used inside a chroot.
+-- This is particularly useful inside a chroot used to build a
+-- disk image, to make the disk image have propellor installed.
--
-- The git repository is cloned (or pulled to update if it already exists).
--
-- All build dependencies are installed, using distribution packages
-- or falling back to using cabal.
bootstrappedFrom :: RepoSource -> Property Linux
-bootstrappedFrom reposource = go `requires` clonedFrom reposource
+bootstrappedFrom reposource = check inChroot $
+ go `requires` clonedFrom reposource
where
go :: Property Linux
go = property "Propellor bootstrapped" $ do
@@ -35,7 +35,8 @@ bootstrappedFrom reposource = go `requires` clonedFrom reposource
assumeChange $ exposeTrueLocaldir $ const $
runShellCommand $ buildShellCommand
[ "cd " ++ localdir
- , bootstrapPropellorCommand system
+ , checkDepsCommand system
+ , buildCommand
]
-- | Clones the propellor repeository into /usr/local/propellor/
@@ -83,7 +84,7 @@ clonedFrom reposource = case reposource of
-- configuration.
copygitconfig :: Property Linux
copygitconfig = property ("Propellor repo git config copied from outside the chroot") $ do
- let gitconfig = localdir <> ".git" <> "config"
+ let gitconfig = localdir </> ".git" </> "config"
cfg <- liftIO $ B.readFile gitconfig
exposeTrueLocaldir $ const $
liftIO $ B.writeFile gitconfig cfg
diff --git a/src/Propellor/Property/Chroot.hs b/src/Propellor/Property/Chroot.hs
index 5f764d47..65749e34 100644
--- a/src/Propellor/Property/Chroot.hs
+++ b/src/Propellor/Property/Chroot.hs
@@ -33,11 +33,10 @@ import qualified Propellor.Property.File as File
import qualified Propellor.Shim as Shim
import Propellor.Property.Mount
import Utility.FileMode
+import Utility.Split
import qualified Data.Map as M
-import Data.List.Utils
import System.Posix.Directory
-import System.Console.Concurrent
-- | Specification of a chroot. Normally you'll use `debootstrapped` or
-- `bootstrapped` to construct a Chroot value.
@@ -201,9 +200,7 @@ propellChroot c@(Chroot loc _ _ _) mkproc systemdonly = property (chrootDesc c "
, "--continue"
, show cmd
]
- let p' = p { env = Just pe }
- r <- liftIO $ withHandle StdoutHandle createProcessSuccess p'
- processChainOutput
+ r <- liftIO $ chainPropellor (p { env = Just pe })
liftIO cleanup
return r
@@ -223,13 +220,12 @@ chain hostlist (ChrootChain hn loc systemdonly onconsole) =
go h = do
changeWorkingDirectory localdir
when onconsole forceConsole
- onlyProcess (provisioningLock loc) $ do
- r <- runPropellor (setInChroot h) $ ensureChildProperties $
- if systemdonly
- then [toChildProperty Systemd.installed]
- else hostProperties h
- flushConcurrentOutput
- putStrLn $ "\n" ++ show r
+ onlyProcess (provisioningLock loc) $
+ runChainPropellor (setInChroot h) $
+ ensureChildProperties $
+ if systemdonly
+ then [toChildProperty Systemd.installed]
+ else hostProperties h
chain _ _ = errorMessage "bad chain command"
inChrootProcess :: Bool -> Chroot -> [String] -> IO (CreateProcess, IO ())
diff --git a/src/Propellor/Property/ConfFile.hs b/src/Propellor/Property/ConfFile.hs
index b49c626e..ce092ec9 100644
--- a/src/Propellor/Property/ConfFile.hs
+++ b/src/Propellor/Property/ConfFile.hs
@@ -11,6 +11,7 @@ module Propellor.Property.ConfFile (
containsIniSetting,
hasIniSection,
lacksIniSection,
+ iniFileContains,
) where
import Propellor.Base
@@ -114,3 +115,13 @@ lacksIniSection f header = adjustIniSection
(const []) -- remove all lines of section
id -- add no lines if section is missing
f
+
+-- | Specifies the whole content of a .ini file.
+--
+-- Revertijg this causes the file not to exist.
+iniFileContains :: FilePath -> [(IniSection, [(IniKey, String)])] -> RevertableProperty UnixLike UnixLike
+iniFileContains f l = f `hasContent` content <!> notPresent f
+ where
+ content = concatMap sectioncontent l
+ sectioncontent (section, keyvalues) = iniHeader section :
+ map (\(key, value) -> key ++ "=" ++ value) keyvalues
diff --git a/src/Propellor/Property/DiskImage.hs b/src/Propellor/Property/DiskImage.hs
index 90b7010b..9300b201 100644
--- a/src/Propellor/Property/DiskImage.hs
+++ b/src/Propellor/Property/DiskImage.hs
@@ -13,11 +13,7 @@ module Propellor.Property.DiskImage (
imageRebuilt,
imageBuiltFrom,
imageExists,
- -- * Finalization
- Finalization,
- grubBooted,
Grub.BIOS(..),
- noFinalization,
) where
import Propellor.Base
@@ -33,6 +29,8 @@ import Propellor.Property.Mount
import Propellor.Property.Fstab (SwapPartition(..), genFstab)
import Propellor.Property.Partition
import Propellor.Property.Rsync
+import Propellor.Types.Info
+import Propellor.Types.Bootloader
import Propellor.Container
import Utility.Path
@@ -49,7 +47,11 @@ type DiskImage = FilePath
-- First the specified Chroot is set up, and its properties are satisfied.
--
-- Then, the disk image is set up, and the chroot is copied into the
--- appropriate partition(s) of it.
+-- appropriate partition(s) of it.
+--
+-- The partitions default to being sized just large enough to fit the files
+-- from the chroot. You can use `addFreeSpace` to make them a bit larger
+-- than that, or `setSize` to use a fixed size.
--
-- Note that the disk image file is reused if it already exists,
-- to avoid expensive IO to generate a new one. And, it's updated in-place,
@@ -67,7 +69,7 @@ type DiskImage = FilePath
-- >
-- > foo = host "foo.example.com" $ props
-- > & imageBuilt "/srv/diskimages/disk.img" mychroot
--- > MSDOS (grubBooted PC)
+-- > MSDOS
-- > [ partition EXT2 `mountedAt` "/boot"
-- > `setFlag` BootFlag
-- > , partition EXT4 `mountedAt` "/"
@@ -79,6 +81,7 @@ type DiskImage = FilePath
-- > mychroot d = debootstrapped mempty d $ props
-- > & osDebian Unstable X86_64
-- > & Apt.installed ["linux-image-amd64"]
+-- > & Grub.installed PC
-- > & User.hasPassword (User "root")
-- > & User.accountFor (User "demo")
-- > & User.hasPassword (User "demo")
@@ -92,7 +95,7 @@ type DiskImage = FilePath
-- > foo = host "foo.example.com" $ props
-- > & imageBuilt "/srv/diskimages/bar-disk.img"
-- > (hostChroot bar (Debootstrapped mempty))
--- > MSDOS (grubBooted PC)
+-- > MSDOS
-- > [ partition EXT2 `mountedAt` "/boot"
-- > `setFlag` BootFlag
-- > , partition EXT4 `mountedAt` "/"
@@ -104,18 +107,19 @@ type DiskImage = FilePath
-- > bar = host "bar.example.com" $ props
-- > & osDebian Unstable X86_64
-- > & Apt.installed ["linux-image-amd64"]
+-- > & Grub.installed PC
-- > & hasPassword (User "root")
-imageBuilt :: DiskImage -> (FilePath -> Chroot) -> TableType -> Finalization -> [PartSpec] -> RevertableProperty (HasInfo + DebianLike) Linux
+imageBuilt :: DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec] -> RevertableProperty (HasInfo + DebianLike) Linux
imageBuilt = imageBuilt' False
-- | Like 'built', but the chroot is deleted and rebuilt from scratch each
-- time. This is more expensive, but useful to ensure reproducible results
-- when the properties of the chroot have been changed.
-imageRebuilt :: DiskImage -> (FilePath -> Chroot) -> TableType -> Finalization -> [PartSpec] -> RevertableProperty (HasInfo + DebianLike) Linux
+imageRebuilt :: DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec] -> RevertableProperty (HasInfo + DebianLike) Linux
imageRebuilt = imageBuilt' True
-imageBuilt' :: Bool -> DiskImage -> (FilePath -> Chroot) -> TableType -> Finalization -> [PartSpec] -> RevertableProperty (HasInfo + DebianLike) Linux
-imageBuilt' rebuild img mkchroot tabletype final partspec =
+imageBuilt' :: Bool -> DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec] -> RevertableProperty (HasInfo + DebianLike) Linux
+imageBuilt' rebuild img mkchroot tabletype partspec =
imageBuiltFrom img chrootdir tabletype final partspec
`requires` Chroot.provisioned chroot
`requires` (cleanrebuild <!> (doNothing :: Property UnixLike))
@@ -135,12 +139,16 @@ imageBuilt' rebuild img mkchroot tabletype final partspec =
-- Before ensuring any other properties of the chroot,
-- avoid starting services. Reverted by imageFinalized.
&^ Chroot.noServices
- -- First stage finalization.
- & fst final
& cachesCleaned
-- Only propagate privdata Info from this chroot, nothing else.
propprivdataonly (Chroot.Chroot d b ip h) =
Chroot.Chroot d b (\c _ -> ip c onlyPrivData) h
+ -- Pick boot loader finalization based on which bootloader is
+ -- installed.
+ final = case fromInfo (containerInfo chroot) of
+ [GrubInstalled] -> grubBooted
+ [] -> unbootable "no bootloader is installed"
+ _ -> unbootable "multiple bootloaders are installed; don't know which to use"
-- | This property is automatically added to the chroot when building a
-- disk image. It cleans any caches of information that can be omitted;
@@ -247,7 +255,7 @@ getMountSz szm l (Just mntpt) =
--
-- If the file is too large, truncates it down to the specified size.
imageExists :: FilePath -> ByteSize -> Property Linux
-imageExists img sz = property ("disk image exists" ++ img) $ liftIO $ do
+imageExists img isz = property ("disk image exists" ++ img) $ liftIO $ do
ms <- catchMaybeIO $ getFileStatus img
case ms of
Just s
@@ -258,21 +266,24 @@ imageExists img sz = property ("disk image exists" ++ img) $ liftIO $ do
_ -> do
L.writeFile img (L.replicate (fromIntegral sz) 0)
return MadeChange
-
--- | A pair of properties. The first property is satisfied within the
--- chroot, and is typically used to download the boot loader.
---
--- The second property is run after the disk image is created,
--- with its populated partition tree mounted in the provided
--- location from the provided loop devices. This will typically
--- take care of installing the boot loader to the image.
+ where
+ sz = ceiling (fromInteger isz / sectorsize) * ceiling sectorsize
+ -- Disks have a sector size, and making a disk image not
+ -- aligned to a sector size will confuse some programs.
+ -- Common sector sizes are 512 and 4096; use 4096 as it's larger.
+ sectorsize = 4096 :: Double
+
+-- | A property that is run after the disk image is created, with
+-- its populated partition tree mounted in the provided
+-- location from the provided loop devices. This is typically used to
+-- install a boot loader in the image's superblock.
--
--- It's ok if the second property leaves additional things mounted
+-- It's ok if the property leaves additional things mounted
-- in the partition tree.
-type Finalization = (Property Linux, (FilePath -> [LoopDev] -> Property Linux))
+type Finalization = (FilePath -> [LoopDev] -> Property Linux)
imageFinalized :: Finalization -> [Maybe MountPoint] -> [MountOpts] -> [LoopDev] -> PartTable -> Property Linux
-imageFinalized (_, final) mnts mntopts devs (PartTable _ parts) =
+imageFinalized final mnts mntopts devs (PartTable _ parts) =
property' "disk image finalized" $ \w ->
withTmpDir "mnt" $ \top ->
go w top `finally` liftIO (unmountall top)
@@ -316,48 +327,53 @@ imageFinalized (_, final) mnts mntopts devs (PartTable _ parts) =
allowservices top = nukeFile (top ++ "/usr/sbin/policy-rc.d")
-noFinalization :: Finalization
-noFinalization = (doNothing, \_ _ -> doNothing)
+unbootable :: String -> Finalization
+unbootable msg = \_ _ -> property desc $ do
+ warningMessage (desc ++ ": " ++ msg)
+ return FailedChange
+ where
+ desc = "image is not bootable"
-- | Makes grub be the boot loader of the disk image.
-grubBooted :: Grub.BIOS -> Finalization
-grubBooted bios = (Grub.installed' bios, boots)
+--
+-- This does not install the grub package. You will need to add
+-- the `Grub.installed` property to the chroot.
+grubBooted :: Finalization
+grubBooted mnt loopdevs = combineProperties "disk image boots using grub" $ props
+ -- bind mount host /dev so grub can access the loop devices
+ & bindMount "/dev" (inmnt "/dev")
+ & mounted "proc" "proc" (inmnt "/proc") mempty
+ & mounted "sysfs" "sys" (inmnt "/sys") mempty
+ -- update the initramfs so it gets the uuid of the root partition
+ & inchroot "update-initramfs" ["-u"]
+ `assume` MadeChange
+ -- work around for http://bugs.debian.org/802717
+ & check haveosprober (inchroot "chmod" ["-x", osprober])
+ & inchroot "update-grub" []
+ `assume` MadeChange
+ & check haveosprober (inchroot "chmod" ["+x", osprober])
+ & inchroot "grub-install" [wholediskloopdev]
+ `assume` MadeChange
+ -- sync all buffered changes out to the disk image
+ -- may not be necessary, but seemed needed sometimes
+ -- when using the disk image right away.
+ & cmdProperty "sync" []
+ `assume` NoChange
where
- boots mnt loopdevs = combineProperties "disk image boots using grub" $ props
- -- bind mount host /dev so grub can access the loop devices
- & bindMount "/dev" (inmnt "/dev")
- & mounted "proc" "proc" (inmnt "/proc") mempty
- & mounted "sysfs" "sys" (inmnt "/sys") mempty
- -- update the initramfs so it gets the uuid of the root partition
- & inchroot "update-initramfs" ["-u"]
- `assume` MadeChange
- -- work around for http://bugs.debian.org/802717
- & check haveosprober (inchroot "chmod" ["-x", osprober])
- & inchroot "update-grub" []
- `assume` MadeChange
- & check haveosprober (inchroot "chmod" ["+x", osprober])
- & inchroot "grub-install" [wholediskloopdev]
- `assume` MadeChange
- -- sync all buffered changes out to the disk image
- -- may not be necessary, but seemed needed sometimes
- -- when using the disk image right away.
- & cmdProperty "sync" []
- `assume` NoChange
- where
- -- cannot use </> since the filepath is absolute
- inmnt f = mnt ++ f
-
- inchroot cmd ps = cmdProperty "chroot" ([mnt, cmd] ++ ps)
-
- haveosprober = doesFileExist (inmnt osprober)
- osprober = "/etc/grub.d/30_os-prober"
-
- -- It doesn't matter which loopdev we use; all
- -- come from the same disk image, and it's the loop dev
- -- for the whole disk image we seek.
- wholediskloopdev = case loopdevs of
- (l:_) -> wholeDiskLoopDev l
- [] -> error "No loop devs provided!"
+ -- cannot use </> since the filepath is absolute
+ inmnt f = mnt ++ f
+
+ inchroot cmd ps = cmdProperty "chroot" ([mnt, cmd] ++ ps)
+
+ haveosprober = doesFileExist (inmnt osprober)
+ osprober = "/etc/grub.d/30_os-prober"
+
+ -- It doesn't matter which loopdev we use; all
+ -- come from the same disk image, and it's the loop dev
+ -- for the whole disk image we seek.
+ wholediskloopdev = case loopdevs of
+ (l:_) -> wholeDiskLoopDev l
+ [] -> error "No loop devs provided!"
isChild :: FilePath -> Maybe MountPoint -> Bool
isChild mntpt (Just d)
diff --git a/src/Propellor/Property/DiskImage/PartSpec.hs b/src/Propellor/Property/DiskImage/PartSpec.hs
index 4b05df03..2b14baa0 100644
--- a/src/Propellor/Property/DiskImage/PartSpec.hs
+++ b/src/Propellor/Property/DiskImage/PartSpec.hs
@@ -69,6 +69,14 @@ addFreeSpace (mp, o, p) freesz = (mp, o, \sz -> p (sz <> freesz))
setSize :: PartSpec -> PartSize -> PartSpec
setSize (mp, o, p) sz = (mp, o, const (p sz))
+-- | Sets the percent of the filesystem blocks reserved for the super-user.
+--
+-- The default is 5% for ext2 and ext4. Some filesystems may not support
+-- this.
+reservedSpacePercentage :: PartSpec -> Int -> PartSpec
+reservedSpacePercentage s percent = adjustp s $ \p ->
+ p { partMkFsOpts = ("-m"):show percent:partMkFsOpts p }
+
-- | Sets a flag on the partition.
setFlag :: PartSpec -> PartFlag -> PartSpec
setFlag s f = adjustp s $ \p -> p { partFlags = (f, True):partFlags p }
diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs
index 1080418b..66418253 100644
--- a/src/Propellor/Property/Docker.hs
+++ b/src/Propellor/Property/Docker.hs
@@ -59,13 +59,13 @@ import qualified Propellor.Property.Pacman as Pacman
import qualified Propellor.Shim as Shim
import Utility.Path
import Utility.ThreadScheduler
+import Utility.Split
import Control.Concurrent.Async hiding (link)
import System.Posix.Directory
import System.Posix.Process
import Prelude hiding (init)
import Data.List hiding (init)
-import Data.List.Utils
import qualified Data.Map as M
import System.Console.Concurrent
@@ -576,8 +576,7 @@ provisionContainer cid = containerDesc cid $ property "provisioned" $ liftIO $ d
let p = inContainerProcess cid
(if isConsole msgh then ["-it"] else [])
(shim : params)
- r <- withHandle StdoutHandle createProcessSuccess p $
- processChainOutput
+ r <- chainPropellor p
when (r /= FailedChange) $
setProvisionedFlag cid
return r
@@ -596,10 +595,9 @@ chain hostlist hn s = case toContainerId s of
where
go cid h = do
changeWorkingDirectory localdir
- onlyProcess (provisioningLock cid) $ do
- r <- runPropellor h $ ensureChildProperties $ hostProperties h
- flushConcurrentOutput
- putStrLn $ "\n" ++ show r
+ onlyProcess (provisioningLock cid) $
+ runChainPropellor h $
+ ensureChildProperties $ hostProperties h
stopContainer :: ContainerId -> IO Bool
stopContainer cid = boolSystem dockercmd [Param "stop", Param $ fromContainerId cid ]
diff --git a/src/Propellor/Property/File.hs b/src/Propellor/Property/File.hs
index 459fe2c7..3293599a 100644
--- a/src/Propellor/Property/File.hs
+++ b/src/Propellor/Property/File.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FlexibleInstances, FlexibleContexts #-}
module Propellor.Property.File where
@@ -105,11 +105,11 @@ hasPrivContent' writemode source f context =
-- | Replaces the content of a file with the transformed content of another file
basedOn :: FilePath -> (FilePath, [Line] -> [Line]) -> Property UnixLike
-f `basedOn` (f', a) = property' desc $ \o -> do
- tmpl <- liftIO $ readFile f'
+f `basedOn` (src, a) = property' desc $ \o -> do
+ tmpl <- liftIO $ readFile src
ensureProperty o $ fileProperty desc (\_ -> a $ lines $ tmpl) f
where
- desc = f ++ " is based on " ++ f'
+ desc = f ++ " is based on " ++ src
-- | Removes a file. Does not remove symlinks or non-plain-files.
notPresent :: FilePath -> Property UnixLike
@@ -150,23 +150,26 @@ link `isSymlinkedTo` (LinkTarget target) = property desc $
-- | Ensures that a file is a copy of another (regular) file.
isCopyOf :: FilePath -> FilePath -> Property UnixLike
-f `isCopyOf` f' = property desc $ go =<< (liftIO $ tryIO $ getFileStatus f')
+f `isCopyOf` src = property desc $ go =<< (liftIO $ tryIO $ getFileStatus src)
where
- desc = f ++ " is copy of " ++ f'
+ desc = f ++ " is copy of " ++ src
go (Right stat) = if isRegularFile stat
- then gocmp =<< (liftIO $ cmp)
- else warningMessage (f' ++ " is not a regular file") >>
+ then ifM (liftIO $ doesFileExist f)
+ ( gocmp =<< (liftIO $ cmp)
+ , doit
+ )
+ else warningMessage (src ++ " is not a regular file") >>
return FailedChange
go (Left e) = warningMessage (show e) >> return FailedChange
- cmp = safeSystem "cmp" [Param "-s", Param "--", File f, File f']
+ cmp = safeSystem "cmp" [Param "-s", Param "--", File f, File src]
gocmp ExitSuccess = noChange
gocmp (ExitFailure 1) = doit
gocmp _ = warningMessage "cmp failed" >> return FailedChange
- doit = makeChange $ copy f' `viaStableTmp` f
- copy src dest = unlessM (runcp src dest) $ errorMessage "cp failed"
- runcp src dest = boolSystem "cp"
+ doit = makeChange $ copy `viaStableTmp` f
+ copy dest = unlessM (runcp dest) $ errorMessage "cp failed"
+ runcp dest = boolSystem "cp"
[Param "--preserve=all", Param "--", File src, File dest]
-- | Ensures that a file/dir has the specified owner and group.
@@ -177,6 +180,20 @@ ownerGroup f (User owner) (Group group) = p `describe` (f ++ " owner " ++ og)
`changesFile` f
og = owner ++ ":" ++ group
+-- | Given a base directory, and a relative path under that
+-- directory, applies a property to each component of the path in turn,
+-- starting with the base directory.
+--
+-- For example, to make a file owned by a user, making sure their home
+-- directory and the subdirectories to it are also owned by them:
+--
+-- > "/home/user/program/file" `hasContent` ["foo"]
+-- > `before` applyPath "/home/user" ".config/program/file"
+-- > (\f -> ownerGroup f (User "user") (Group "user"))
+applyPath :: Monoid (Property metatypes) => FilePath -> FilePath -> (FilePath -> Property metatypes) -> Property metatypes
+applyPath basedir relpath mkp = mconcat $
+ map mkp (scanl (</>) basedir (splitPath relpath))
+
-- | Ensures that a file/dir has the specfied mode.
mode :: FilePath -> FileMode -> Property UnixLike
mode f v = p `changesFile` f
@@ -290,3 +307,12 @@ readConfigFileName = readish . unescape
Nothing -> '_' : ns ++ unescape cs'
Just n -> chr n : unescape cs'
unescape (c:cs) = c : unescape cs
+
+data Overwrite = OverwriteExisting | PreserveExisting
+
+-- | When passed PreserveExisting, only ensures the property when the file
+-- does not exist.
+checkOverwrite :: Overwrite -> FilePath -> (FilePath -> Property i) -> Property i
+checkOverwrite OverwriteExisting f mkp = mkp f
+checkOverwrite PreserveExisting f mkp =
+ check (not <$> doesFileExist f) (mkp f)
diff --git a/src/Propellor/Property/FreeDesktop.hs b/src/Propellor/Property/FreeDesktop.hs
new file mode 100644
index 00000000..75dcbdfa
--- /dev/null
+++ b/src/Propellor/Property/FreeDesktop.hs
@@ -0,0 +1,29 @@
+-- | Freedesktop.org configuration file properties.
+
+module Propellor.Property.FreeDesktop where
+
+import Propellor.Base
+import Propellor.Property.ConfFile
+
+desktopFile :: String -> FilePath
+desktopFile s = s ++ ".desktop"
+
+-- | Name used in a desktop file; user visible.
+type Name = String
+
+-- | Command that a dekstop file runs. May include parameters.
+type Exec = String
+
+-- | Specifies an autostart file. By default it will be located in the
+-- system-wide autostart directory.
+autostart :: FilePath -> Name -> Exec -> RevertableProperty UnixLike UnixLike
+autostart f n e = ("/etc/xdg/autostart" </> f) `iniFileContains`
+ [ ("Desktop Entry",
+ [ ("Type", "Application")
+ , ("Version", "1.0")
+ , ("Name", n)
+ , ("Comment", "Autostart")
+ , ("Terminal", "False")
+ , ("Exec", e)
+ ] )
+ ]
diff --git a/src/Propellor/Property/Grub.hs b/src/Propellor/Property/Grub.hs
index 9dd5e8e1..4bad7b2b 100644
--- a/src/Propellor/Property/Grub.hs
+++ b/src/Propellor/Property/Grub.hs
@@ -3,6 +3,9 @@ module Propellor.Property.Grub where
import Propellor.Base
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt
+import Propellor.Property.Chroot (inChroot)
+import Propellor.Types.Info
+import Propellor.Types.Bootloader
-- | Eg, \"hd0,0\" or \"xen/xvda1\"
type GrubDevice = String
@@ -18,9 +21,10 @@ data BIOS = PC | EFI64 | EFI32 | Coreboot | Xen
-- | Installs the grub package. This does not make grub be used as the
-- bootloader.
--
--- This includes running update-grub.
-installed :: BIOS -> Property DebianLike
-installed bios = installed' bios `onChange` mkConfig
+-- This includes running update-grub, unless it's run in a chroot.
+installed :: BIOS -> Property (HasInfo + DebianLike)
+installed bios = installed' bios
+ `onChange` (check (not <$> inChroot) mkConfig)
-- Run update-grub, to generate the grub boot menu. It will be
-- automatically updated when kernel packages are installed.
@@ -29,11 +33,11 @@ mkConfig = tightenTargets $ cmdProperty "update-grub" []
`assume` MadeChange
-- | Installs grub; does not run update-grub.
-installed' :: BIOS -> Property Linux
-installed' bios = (aptinstall `pickOS` unsupportedOS)
+installed' :: BIOS -> Property (HasInfo + DebianLike)
+installed' bios = setInfoProperty aptinstall
+ (toInfo [GrubInstalled])
`describe` "grub package installed"
where
- aptinstall :: Property DebianLike
aptinstall = Apt.installed [debpkg]
debpkg = case bios of
PC -> "grub-pc"
@@ -64,7 +68,7 @@ boots dev = tightenTargets $ cmdProperty "grub-install" [dev]
--
-- The rootdev should be in the form "hd0", while the bootdev is in the form
-- "xen/xvda".
-chainPVGrub :: GrubDevice -> GrubDevice -> TimeoutSecs -> Property DebianLike
+chainPVGrub :: GrubDevice -> GrubDevice -> TimeoutSecs -> Property (HasInfo + DebianLike)
chainPVGrub rootdev bootdev timeout = combineProperties desc $ props
& File.dirExists "/boot/grub"
& "/boot/grub/menu.lst" `File.hasContent`
diff --git a/src/Propellor/Property/HostingProvider/Linode.hs b/src/Propellor/Property/HostingProvider/Linode.hs
index fca3df63..ebe8d261 100644
--- a/src/Propellor/Property/HostingProvider/Linode.hs
+++ b/src/Propellor/Property/HostingProvider/Linode.hs
@@ -8,7 +8,7 @@ import Utility.FileMode
-- | Configures grub to use the serial console as set up by Linode.
-- Useful when running a distribution supplied kernel.
-- <https://www.linode.com/docs/tools-reference/custom-kernels-distros/run-a-distribution-supplied-kernel-with-kvm>
-serialGrub :: Property DebianLike
+serialGrub :: Property (HasInfo + DebianLike)
serialGrub = "/etc/default/grub" `File.containsLines`
[ "GRUB_CMDLINE_LINUX=\"console=ttyS0,19200n8\""
, "GRUB_DISABLE_LINUX_UUID=true"
@@ -17,11 +17,12 @@ serialGrub = "/etc/default/grub" `File.containsLines`
]
`onChange` Grub.mkConfig
`requires` Grub.installed Grub.PC
+ `describe` "GRUB configured for Linode serial console"
-- | Linode's pv-grub-x86_64 (only used for its older XEN instances)
-- does not support booting recent Debian kernels compressed
-- with xz. This sets up pv-grub chaining to enable it.
-chainPVGrub :: Grub.TimeoutSecs -> Property DebianLike
+chainPVGrub :: Grub.TimeoutSecs -> Property (HasInfo + DebianLike)
chainPVGrub = Grub.chainPVGrub "hd0" "xen/xvda"
-- | Linode disables mlocate's cron job's execute permissions,
diff --git a/src/Propellor/Property/Hostname.hs b/src/Propellor/Property/Hostname.hs
index e1342d91..1eb9d690 100644
--- a/src/Propellor/Property/Hostname.hs
+++ b/src/Propellor/Property/Hostname.hs
@@ -3,9 +3,9 @@ module Propellor.Property.Hostname where
import Propellor.Base
import qualified Propellor.Property.File as File
import Propellor.Property.Chroot (inChroot)
+import Utility.Split
import Data.List
-import Data.List.Utils
-- | Ensures that the hostname is set using best practices, to whatever
-- name the `Host` has.
diff --git a/src/Propellor/Property/LightDM.hs b/src/Propellor/Property/LightDM.hs
index 339fa9a3..69538d89 100644
--- a/src/Propellor/Property/LightDM.hs
+++ b/src/Propellor/Property/LightDM.hs
@@ -10,7 +10,8 @@ installed :: Property DebianLike
installed = Apt.installed ["lightdm"]
-- | Configures LightDM to skip the login screen and autologin as a user.
-autoLogin :: User -> Property UnixLike
+autoLogin :: User -> Property DebianLike
autoLogin (User u) = "/etc/lightdm/lightdm.conf" `ConfFile.containsIniSetting`
("SeatDefaults", "autologin-user", u)
`describe` "lightdm autologin"
+ `requires` installed
diff --git a/src/Propellor/Property/Sbuild.hs b/src/Propellor/Property/Sbuild.hs
index 00109381..460d0b16 100644
--- a/src/Propellor/Property/Sbuild.hs
+++ b/src/Propellor/Property/Sbuild.hs
@@ -98,10 +98,10 @@ import qualified Propellor.Property.File as File
import qualified Propellor.Property.Schroot as Schroot
import qualified Propellor.Property.Reboot as Reboot
import qualified Propellor.Property.User as User
-
import Utility.FileMode
+import Utility.Split
+
import Data.List
-import Data.List.Utils
type Suite = String
diff --git a/src/Propellor/Property/SiteSpecific/JoeySites.hs b/src/Propellor/Property/SiteSpecific/JoeySites.hs
index 063a2eda..6e0d6c4e 100644
--- a/src/Propellor/Property/SiteSpecific/JoeySites.hs
+++ b/src/Propellor/Property/SiteSpecific/JoeySites.hs
@@ -22,10 +22,10 @@ import qualified Propellor.Property.Systemd as Systemd
import qualified Propellor.Property.Fail2Ban as Fail2Ban
import qualified Propellor.Property.LetsEncrypt as LetsEncrypt
import Utility.FileMode
+import Utility.Split
import Data.List
import System.Posix.Files
-import Data.String.Utils
scrollBox :: Property (HasInfo + DebianLike)
scrollBox = propertyList "scroll server" $ props
@@ -248,7 +248,7 @@ gitServer hosts = propertyList "git.kitenet.net setup" $ props
]
`describe` "cgit configured"
-- I keep the website used for git.kitenet.net/git.joeyh.name checked into git..
- & Git.cloned (User "root") "/srv/git/joey/git.kitenet.net.git" "/srv/web/git.kitenet.net" Nothing
+ & Git.cloned (User "joey") "/srv/git/joey/git.kitenet.net.git" "/srv/web/git.kitenet.net" Nothing
-- Don't need global apache configuration for cgit.
! Apache.confEnabled "cgit"
& website "git.kitenet.net"
@@ -681,6 +681,10 @@ dkimInstalled = go `onChange` Service.restarted "opendkim"
& File.ownerGroup "/etc/mail/dkim.key" (User "opendkim") (Group "opendkim")
& "/etc/default/opendkim" `File.containsLine`
"SOCKET=\"inet:8891@localhost\""
+ `onChange`
+ (cmdProperty "/lib/opendkim/opendkim.service.generate" []
+ `assume` MadeChange)
+ `onChange` Service.restarted "opendkim"
& "/etc/opendkim.conf" `File.containsLines`
[ "KeyFile /etc/mail/dkim.key"
, "SubDomains yes"
@@ -694,9 +698,22 @@ dkimInstalled = go `onChange` Service.restarted "opendkim"
domainKey :: (BindDomain, Record)
domainKey = (RelDomain "mail._domainkey", TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCc+/rfzNdt5DseBBmfB3C6sVM7FgVvf4h1FeCfyfwPpVcmPdW6M2I+NtJsbRkNbEICxiP6QY2UM0uoo9TmPqLgiCCG2vtuiG6XMsS0Y/gGwqKM7ntg/7vT1Go9vcquOFFuLa5PnzpVf8hB9+PMFdS4NPTvWL2c5xxshl/RJzICnQIDAQAB")
-hasJoeyCAChain :: Property (HasInfo + UnixLike)
-hasJoeyCAChain = "/etc/ssl/certs/joeyca.pem" `File.hasPrivContentExposed`
- Context "joeyca.pem"
+postfixSaslPasswordClient :: Property (HasInfo + DebianLike)
+postfixSaslPasswordClient = combineProperties "postfix uses SASL password to authenticate with smarthost" $ props
+ & Postfix.satellite
+ & Postfix.mappedFile "/etc/postfix/sasl_passwd"
+ (`File.hasPrivContent` (Context "kitenet.net"))
+ & Postfix.mainCfFile `File.containsLines`
+ [ "# TLS setup for SASL auth to kite"
+ , "smtp_sasl_auth_enable = yes"
+ , "smtp_tls_security_level = encrypt"
+ , "smtp_sasl_tls_security_options = noanonymous"
+ , "relayhost = [kitenet.net]"
+ , "smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd"
+ , "# kite's fingerprint"
+ , "smtp_tls_fingerprint_cert_match = 13:B0:0C:F3:11:83:A5:EB:A9:37:C6:C5:ED:16:60:86"
+ ]
+ `onChange` Postfix.reloaded
hasPostfixCert :: Context -> Property (HasInfo + UnixLike)
hasPostfixCert ctx = combineProperties "postfix tls cert installed" $ props
diff --git a/src/Propellor/Property/Systemd.hs b/src/Propellor/Property/Systemd.hs
index 7c40bd16..d1a94aa8 100644
--- a/src/Propellor/Property/Systemd.hs
+++ b/src/Propellor/Property/Systemd.hs
@@ -55,9 +55,9 @@ import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.File as File
import Propellor.Property.Systemd.Core
import Utility.FileMode
+import Utility.Split
import Data.List
-import Data.List.Utils
import qualified Data.Map as M
type ServiceName = String
diff --git a/src/Propellor/Property/User.hs b/src/Propellor/Property/User.hs
index 0c7e48f2..ce2611bc 100644
--- a/src/Propellor/Property/User.hs
+++ b/src/Propellor/Property/User.hs
@@ -97,8 +97,12 @@ setPassword getpassword = getpassword $ go
-- | Makes a user's password be the passed String. Highly insecure:
-- The password is right there in your config file for anyone to see!
hasInsecurePassword :: User -> String -> Property DebianLike
-hasInsecurePassword u@(User n) p = property (n ++ " has insecure password") $
- chpasswd u p []
+hasInsecurePassword u@(User n) p = go
+ `requires` shadowConfig True
+ where
+ go :: Property DebianLike
+ go = property (n ++ " has insecure password") $
+ chpasswd u p []
chpasswd :: User -> String -> [String] -> Propellor Result
chpasswd (User user) v ps = makeChange $ withHandle StdinHandle createProcessSuccess
diff --git a/src/Propellor/Property/XFCE.hs b/src/Propellor/Property/XFCE.hs
new file mode 100644
index 00000000..dc57660f
--- /dev/null
+++ b/src/Propellor/Property/XFCE.hs
@@ -0,0 +1,41 @@
+module Propellor.Property.XFCE where
+
+import Propellor.Base
+import qualified Propellor.Property.Apt as Apt
+import qualified Propellor.Property.File as File
+import qualified Propellor.Property.User as User
+
+installed :: Property DebianLike
+installed = Apt.installed ["task-xfce-desktop"]
+ `describe` "XFCE desktop installed"
+
+-- | Minimal install of XFCE, with a terminal emulator and panel,
+-- and X and network-manager, but not any of the extra apps.
+installedMin :: Property DebianLike
+installedMin = Apt.installedMin ["xfce4", "xfce4-terminal", "task-desktop"]
+ `describe` "minimal XFCE desktop installed"
+
+-- | Installs network-manager-gnome, which is the way to get
+-- network-manager to manage networking in XFCE too.
+networkManager :: Property DebianLike
+networkManager = Apt.installedMin ["network-manager-gnome"]
+
+-- | Normally at first login, XFCE asks what kind of panel the user wants.
+-- This enables the default configuration noninteractively.
+defaultPanelFor :: User -> File.Overwrite -> Property DebianLike
+defaultPanelFor u@(User username) overwrite = property' desc $ \w -> do
+ home <- liftIO $ User.homedir u
+ ensureProperty w (go home)
+ where
+ desc = "default XFCE panel for " ++ username
+ basecf = ".config" </> "xfce4" </> "xfconf"
+ </> "xfce-perchannel-xml" </> "xfce4-panel.xml"
+ -- This location is probably Debian-specific.
+ defcf = "/etc/xdg/xfce4/panel/default.xml"
+ go :: FilePath -> Property DebianLike
+ go home = tightenTargets $
+ File.checkOverwrite overwrite (home </> basecf) $ \cf ->
+ cf `File.isCopyOf` defcf
+ `before` File.applyPath home basecf
+ (\f -> File.ownerGroup f u (userGroup u))
+ `requires` Apt.installed ["xfce4-panel"]
diff --git a/src/Propellor/Property/ZFS/Process.hs b/src/Propellor/Property/ZFS/Process.hs
index 372bac6d..42b23df2 100644
--- a/src/Propellor/Property/ZFS/Process.hs
+++ b/src/Propellor/Property/ZFS/Process.hs
@@ -5,7 +5,8 @@
module Propellor.Property.ZFS.Process where
import Propellor.Base
-import Data.String.Utils (split)
+import Utility.Split
+
import Data.List
-- | Gets the properties of a ZFS volume.
diff --git a/src/Propellor/Protocol.hs b/src/Propellor/Protocol.hs
index e90155f3..ae7e0404 100644
--- a/src/Propellor/Protocol.hs
+++ b/src/Propellor/Protocol.hs
@@ -53,7 +53,11 @@ sendMarked' h marker s = do
hFlush h
getMarked :: Handle -> Marker -> IO (Maybe String)
-getMarked h marker = go =<< catchMaybeIO (hGetLine h)
+getMarked h marker = do
+ -- Avoid buffering anything in Handle, so that the data after
+ -- the marker will be available to be read from the underlying Fd.
+ hSetBuffering stdin NoBuffering
+ go =<< catchMaybeIO (hGetLine h)
where
go Nothing = return Nothing
go (Just l) = case fromMarked marker l of
@@ -65,8 +69,8 @@ getMarked h marker = go =<< catchMaybeIO (hGetLine h)
debug ["received marked", marker]
return (Just v)
-req :: Stage -> Marker -> (String -> IO ()) -> IO ()
-req stage marker a = do
+reqMarked :: Stage -> Marker -> (String -> IO ()) -> IO ()
+reqMarked stage marker a = do
debug ["requested marked", marker]
sendMarked' stdout statusMarker (show stage)
maybe noop a =<< getMarked stdin marker
diff --git a/src/Propellor/Spin.hs b/src/Propellor/Spin.hs
index 3b3729f9..cd964e16 100644
--- a/src/Propellor/Spin.hs
+++ b/src/Propellor/Spin.hs
@@ -178,34 +178,16 @@ getSshTarget target hst
update :: Maybe HostName -> IO ()
update forhost = do
whenM hasGitRepo $
- req NeedRepoUrl repoUrlMarker setRepoUrl
+ reqMarked NeedRepoUrl repoUrlMarker setRepoUrl
makePrivDataDir
createDirectoryIfMissing True (takeDirectory privfile)
- req NeedPrivData privDataMarker $
+ reqMarked NeedPrivData privDataMarker $
writeFileProtected privfile
whenM hasGitRepo $
- req NeedGitPush gitPushMarker $ \_ -> do
- hin <- dup stdInput
- hout <- dup stdOutput
- hClose stdin
- hClose stdout
- -- Not using git pull because git 2.5.0 badly
- -- broke its option parser.
- unlessM (boolSystemNonConcurrent "git" (pullparams hin hout)) $
- errorMessage "git fetch from client failed"
- unlessM (boolSystemNonConcurrent "git" [Param "merge", Param "FETCH_HEAD"]) $
- errorMessage "git merge from client failed"
+ gitPullFromUpdateServer
where
- pullparams hin hout =
- [ Param "fetch"
- , Param "--progress"
- , Param "--upload-pack"
- , Param $ "./propellor --gitpush " ++ show hin ++ " " ++ show hout
- , Param "."
- ]
-
-- When --spin --relay is run, get a privdata file
-- to be relayed to the target host.
privfile = maybe privDataLocal privDataRelay forhost
@@ -336,31 +318,6 @@ sendPrecompiled hn = void $ actionMessage "Uploading locally compiled propellor
, "rm -f " ++ remotetarball
]
--- Shim for git push over the propellor ssh channel.
--- Reads from stdin and sends it to hout;
--- reads from hin and sends it to stdout.
-gitPushHelper :: Fd -> Fd -> IO ()
-gitPushHelper hin hout = void $ fromstdin `concurrently` tostdout
- where
- fromstdin = do
- h <- fdToHandle hout
- connect stdin h
- tostdout = do
- h <- fdToHandle hin
- connect h stdout
- connect fromh toh = do
- hSetBinaryMode fromh True
- hSetBinaryMode toh True
- b <- B.hGetSome fromh 40960
- if B.null b
- then do
- hClose fromh
- hClose toh
- else do
- B.hPut toh b
- hFlush toh
- connect fromh toh
-
mergeSpin :: IO ()
mergeSpin = do
branch <- getCurrentBranch
@@ -388,3 +345,56 @@ findLastNonSpinCommit = do
spinCommitMessage :: String
spinCommitMessage = "propellor spin"
+
+-- Stdin and stdout are connected to the updateServer over ssh.
+-- Request that it run git upload-pack, and connect that up to a git fetch
+-- to receive the data.
+gitPullFromUpdateServer :: IO ()
+gitPullFromUpdateServer = reqMarked NeedGitPush gitPushMarker $ \_ -> do
+ -- Note that this relies on data not being buffered in the stdin
+ -- Handle, since such buffered data would not be available in the
+ -- FD passed to git fetch.
+ hin <- dup stdInput
+ hout <- dup stdOutput
+ hClose stdin
+ hClose stdout
+ -- Not using git pull because git 2.5.0 badly
+ -- broke its option parser.
+ unlessM (boolSystemNonConcurrent "git" (fetchparams hin hout)) $
+ errorMessage "git fetch from client failed"
+ unlessM (boolSystemNonConcurrent "git" [Param "merge", Param "FETCH_HEAD"]) $
+ errorMessage "git merge from client failed"
+ where
+ fetchparams hin hout =
+ [ Param "fetch"
+ , Param "--progress"
+ , Param "--upload-pack"
+ , Param $ "./propellor --gitpush " ++ show hin ++ " " ++ show hout
+ , Param "."
+ ]
+
+-- Shim for git push over the propellor ssh channel.
+-- Reads from stdin and sends it to hout;
+-- reads from hin and sends it to stdout.
+gitPushHelper :: Fd -> Fd -> IO ()
+gitPushHelper hin hout = void $ fromstdin `concurrently` tostdout
+ where
+ fromstdin = do
+ h <- fdToHandle hout
+ stdin *>* h
+ tostdout = do
+ h <- fdToHandle hin
+ h *>* stdout
+
+-- Forward data from one handle to another.
+(*>*) :: Handle -> Handle -> IO ()
+fromh *>* toh = do
+ b <- B.hGetSome fromh 40960
+ if B.null b
+ then do
+ hClose fromh
+ hClose toh
+ else do
+ B.hPut toh b
+ hFlush toh
+ fromh *>* toh
diff --git a/src/Propellor/Ssh.hs b/src/Propellor/Ssh.hs
index a7a9452e..a8f50ed0 100644
--- a/src/Propellor/Ssh.hs
+++ b/src/Propellor/Ssh.hs
@@ -6,7 +6,7 @@ import Utility.FileSystemEncoding
import System.PosixCompat
import Data.Time.Clock.POSIX
-import qualified Data.Hash.MD5 as MD5
+import Data.Hashable
-- Parameters can be passed to both ssh and scp, to enable a ssh connection
-- caching socket.
@@ -50,24 +50,22 @@ sshCachingParams hn = do
-- 100 bytes. Try to never construct a filename longer than that.
--
-- When space allows, include the full hostname in the socket filename.
--- Otherwise, include at least a partial md5sum of it,
--- to avoid using the same socket file for multiple hosts.
+-- Otherwise, a checksum of the hostname is included in the name, to
+-- avoid using the same socket file for multiple hosts.
socketFile :: FilePath -> HostName -> FilePath
socketFile home hn = selectSocketFile
- [ sshdir </> hn ++ ".sock"
+ [ sshdir </> hn ++ ".sock"
, sshdir </> hn
- , sshdir </> take 10 hn ++ "-" ++ md5
- , sshdir </> md5
- , home </> ".propellor-" ++ md5
+ , sshdir </> take 10 hn ++ "-" ++ checksum
+ , sshdir </> checksum
]
- (".propellor-" ++ md5)
+ (home </> ".propellor-" ++ checksum)
where
sshdir = home </> ".ssh" </> "propellor"
- md5 = take 9 $ MD5.md5s $ MD5.Str hn
+ checksum = take 9 $ show $ abs $ hash hn
selectSocketFile :: [FilePath] -> FilePath -> FilePath
selectSocketFile [] d = d
-selectSocketFile [f] _ = f
selectSocketFile (f:fs) d
| valid_unix_socket_path f = f
| otherwise = selectSocketFile fs d
diff --git a/src/Propellor/Types/Bootloader.hs b/src/Propellor/Types/Bootloader.hs
new file mode 100644
index 00000000..c6953b94
--- /dev/null
+++ b/src/Propellor/Types/Bootloader.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE FlexibleInstances #-}
+
+module Propellor.Types.Bootloader where
+
+import Propellor.Types.Info
+
+-- | Boot loader installed on a host.
+data BootloaderInstalled = GrubInstalled
+ deriving (Typeable, Show)
+
+instance IsInfo [BootloaderInstalled] where
+ propagateInfo _ = PropagateInfo False
diff --git a/src/Propellor/Types/Dns.hs b/src/Propellor/Types/Dns.hs
index 8d62e63b..87756d81 100644
--- a/src/Propellor/Types/Dns.hs
+++ b/src/Propellor/Types/Dns.hs
@@ -6,12 +6,12 @@ import Propellor.Types.OS (HostName)
import Propellor.Types.Empty
import Propellor.Types.Info
import Propellor.Types.ConfigurableValue
+import Utility.Split
import Data.Word
import qualified Data.Map as M
import qualified Data.Set as S
import Data.List
-import Data.String.Utils (split, replace)
import Data.Monoid
import Prelude
@@ -102,14 +102,14 @@ data Record
type ReverseIP = String
reverseIP :: IPAddr -> ReverseIP
-reverseIP (IPv4 addr) = intercalate "." (reverse $ split "." addr) ++ ".in-addr.arpa"
+reverseIP (IPv4 addr) = intercalate "." (reverse $ splitc '.' addr) ++ ".in-addr.arpa"
reverseIP addr@(IPv6 _) = reverse (intersperse '.' $ replace ":" "" $ val $ canonicalIP addr) ++ ".ip6.arpa"
-- | Converts an IP address (particularly IPv6) to canonical, fully
-- expanded form.
canonicalIP :: IPAddr -> IPAddr
canonicalIP (IPv4 addr) = IPv4 addr
-canonicalIP (IPv6 addr) = IPv6 $ intercalate ":" $ map canonicalGroup $ split ":" $ replaceImplicitGroups addr
+canonicalIP (IPv6 addr) = IPv6 $ intercalate ":" $ map canonicalGroup $ splitc ':' $ replaceImplicitGroups addr
where
canonicalGroup g
| l <= 4 = replicate (4 - l) '0' ++ g
@@ -117,7 +117,7 @@ canonicalIP (IPv6 addr) = IPv6 $ intercalate ":" $ map canonicalGroup $ split ":
where
l = length g
emptyGroups n = iterate (++ ":") "" !! n
- numberOfImplicitGroups a = 8 - length (split ":" $ replace "::" "" a)
+ numberOfImplicitGroups a = 8 - length (splitc ':' $ replace "::" "" a)
replaceImplicitGroups a = concat $ aux $ split "::" a
where
aux [] = []
diff --git a/src/Propellor/Types/OS.hs b/src/Propellor/Types/OS.hs
index 41f839f1..01d777a4 100644
--- a/src/Propellor/Types/OS.hs
+++ b/src/Propellor/Types/OS.hs
@@ -59,7 +59,7 @@ data DebianKernel = Linux | KFreeBSD | Hurd
deriving (Show, Eq)
-- | Debian has several rolling suites, and a number of stable releases,
--- such as Stable "jessie".
+-- such as Stable "stretch".
data DebianSuite = Experimental | Unstable | Testing | Stable Release
deriving (Show, Eq)
diff --git a/src/Propellor/Types/ZFS.hs b/src/Propellor/Types/ZFS.hs
index 22b848fa..c68f6ba5 100644
--- a/src/Propellor/Types/ZFS.hs
+++ b/src/Propellor/Types/ZFS.hs
@@ -7,10 +7,10 @@
module Propellor.Types.ZFS where
import Propellor.Types.ConfigurableValue
+import Utility.Split
import Data.String
import qualified Data.Set as Set
-import qualified Data.String.Utils as SU
import Data.List
-- | A single ZFS filesystem.
@@ -46,7 +46,7 @@ instance Show ZDataset where
show = val
instance IsString ZDataset where
- fromString s = ZDataset $ SU.split "/" s
+ fromString s = ZDataset $ splitc '/' s
instance IsString ZPool where
fromString p = ZPool p
diff --git a/src/Utility/DataUnits.hs b/src/Utility/DataUnits.hs
index 6e40932e..a6c9ffcf 100644
--- a/src/Utility/DataUnits.hs
+++ b/src/Utility/DataUnits.hs
@@ -45,6 +45,7 @@ module Utility.DataUnits (
ByteSize,
roughSize,
+ roughSize',
compareSizes,
readSize
) where
@@ -109,7 +110,10 @@ oldSchoolUnits = zipWith (curry mingle) storageUnits memoryUnits
{- approximate display of a particular number of bytes -}
roughSize :: [Unit] -> Bool -> ByteSize -> String
-roughSize units short i
+roughSize units short i = roughSize' units short 2 i
+
+roughSize' :: [Unit] -> Bool -> Int -> ByteSize -> String
+roughSize' units short precision i
| i < 0 = '-' : findUnit units' (negate i)
| otherwise = findUnit units' i
where
@@ -123,7 +127,7 @@ roughSize units short i
showUnit x (Unit size abbrev name) = s ++ " " ++ unit
where
v = (fromInteger x :: Double) / fromInteger size
- s = showImprecise 2 v
+ s = showImprecise precision v
unit
| short = abbrev
| s == "1" = name
diff --git a/src/Utility/FileMode.hs b/src/Utility/FileMode.hs
index bb3780c6..d9a26944 100644
--- a/src/Utility/FileMode.hs
+++ b/src/Utility/FileMode.hs
@@ -1,6 +1,6 @@
{- File mode utilities.
-
- - Copyright 2010-2012 Joey Hess <id@joeyh.name>
+ - Copyright 2010-2017 Joey Hess <id@joeyh.name>
-
- License: BSD-2-clause
-}
@@ -130,6 +130,21 @@ withUmask umask a = bracket setup cleanup go
withUmask _ a = a
#endif
+getUmask :: IO FileMode
+#ifndef mingw32_HOST_OS
+getUmask = bracket setup cleanup return
+ where
+ setup = setFileCreationMask nullFileMode
+ cleanup = setFileCreationMask
+#else
+getUmask = return nullFileMode
+#endif
+
+defaultFileMode :: IO FileMode
+defaultFileMode = do
+ umask <- getUmask
+ return $ intersectFileModes (complement umask) stdFileMode
+
combineModes :: [FileMode] -> FileMode
combineModes [] = 0
combineModes [m] = m
@@ -162,7 +177,10 @@ writeFileProtected file content = writeFileProtected' file
(\h -> hPutStr h content)
writeFileProtected' :: FilePath -> (Handle -> IO ()) -> IO ()
-writeFileProtected' file writer = withUmask 0o0077 $
+writeFileProtected' file writer = protectedOutput $
withFile file WriteMode $ \h -> do
void $ tryIO $ modifyFileMode file $ removeModes otherGroupModes
writer h
+
+protectedOutput :: IO a -> IO a
+protectedOutput = withUmask 0o0077
diff --git a/src/Utility/FileSystemEncoding.hs b/src/Utility/FileSystemEncoding.hs
index be43ace9..444dc4a9 100644
--- a/src/Utility/FileSystemEncoding.hs
+++ b/src/Utility/FileSystemEncoding.hs
@@ -10,8 +10,8 @@
module Utility.FileSystemEncoding (
useFileSystemEncoding,
+ fileEncoding,
withFilePath,
- md5FilePath,
decodeBS,
encodeBS,
decodeW8,
@@ -19,6 +19,10 @@ module Utility.FileSystemEncoding (
encodeW8NUL,
decodeW8NUL,
truncateFilePath,
+ s2w8,
+ w82s,
+ c2w8,
+ w82c,
) where
import qualified GHC.Foreign as GHC
@@ -26,17 +30,15 @@ import qualified GHC.IO.Encoding as Encoding
import Foreign.C
import System.IO
import System.IO.Unsafe
-import qualified Data.Hash.MD5 as MD5
import Data.Word
-import Data.Bits.Utils
import Data.List
-import Data.List.Utils
import qualified Data.ByteString.Lazy as L
#ifdef mingw32_HOST_OS
import qualified Data.ByteString.Lazy.UTF8 as L8
#endif
import Utility.Exception
+import Utility.Split
{- Makes all subsequent Handles that are opened, as well as stdio Handles,
- use the filesystem encoding, instead of the encoding of the current
@@ -63,6 +65,13 @@ useFileSystemEncoding = do
hSetEncoding stderr e
Encoding.setLocaleEncoding e
+fileEncoding :: Handle -> IO ()
+#ifndef mingw32_HOST_OS
+fileEncoding h = hSetEncoding h =<< Encoding.getFileSystemEncoding
+#else
+fileEncoding h = hSetEncoding h Encoding.utf8
+#endif
+
{- Marshal a Haskell FilePath into a NUL terminated C string using temporary
- storage. The FilePath is encoded using the filesystem encoding,
- reversing the decoding that should have been done when the FilePath
@@ -93,10 +102,6 @@ _encodeFilePath fp = unsafePerformIO $ do
GHC.withCString enc fp (GHC.peekCString Encoding.char8)
`catchNonAsync` (\_ -> return fp)
-{- Encodes a FilePath into a Md5.Str, applying the filesystem encoding. -}
-md5FilePath :: FilePath -> MD5.Str
-md5FilePath = MD5.Str . _encodeFilePath
-
{- Decodes a ByteString into a FilePath, applying the filesystem encoding. -}
decodeBS :: L.ByteString -> FilePath
#ifndef mingw32_HOST_OS
@@ -137,14 +142,26 @@ decodeW8 = s2w8 . _encodeFilePath
{- Like encodeW8 and decodeW8, but NULs are passed through unchanged. -}
encodeW8NUL :: [Word8] -> FilePath
-encodeW8NUL = intercalate nul . map encodeW8 . split (s2w8 nul)
+encodeW8NUL = intercalate [nul] . map encodeW8 . splitc (c2w8 nul)
where
- nul = ['\NUL']
+ nul = '\NUL'
decodeW8NUL :: FilePath -> [Word8]
-decodeW8NUL = intercalate (s2w8 nul) . map decodeW8 . split nul
+decodeW8NUL = intercalate [c2w8 nul] . map decodeW8 . splitc nul
where
- nul = ['\NUL']
+ nul = '\NUL'
+
+c2w8 :: Char -> Word8
+c2w8 = fromIntegral . fromEnum
+
+w82c :: Word8 -> Char
+w82c = toEnum . fromIntegral
+
+s2w8 :: String -> [Word8]
+s2w8 = map c2w8
+
+w82s :: [Word8] -> String
+w82s = map w82c
{- Truncates a FilePath to the given number of bytes (or less),
- as represented on disk.
diff --git a/src/Utility/LinuxMkLibs.hs b/src/Utility/LinuxMkLibs.hs
index 122f3964..15f82fd1 100644
--- a/src/Utility/LinuxMkLibs.hs
+++ b/src/Utility/LinuxMkLibs.hs
@@ -12,10 +12,10 @@ import Utility.Directory
import Utility.Process
import Utility.Monad
import Utility.Path
+import Utility.Split
import Data.Maybe
import System.FilePath
-import Data.List.Utils
import System.Posix.Files
import Data.Char
import Control.Monad.IfElse
diff --git a/src/Utility/PartialPrelude.hs b/src/Utility/PartialPrelude.hs
index 55795563..47e98318 100644
--- a/src/Utility/PartialPrelude.hs
+++ b/src/Utility/PartialPrelude.hs
@@ -2,7 +2,7 @@
- bugs.
-
- This exports functions that conflict with the prelude, which avoids
- - them being accidentially used.
+ - them being accidentally used.
-}
{-# OPTIONS_GHC -fno-warn-tabs #-}
diff --git a/src/Utility/Path.hs b/src/Utility/Path.hs
index 3ee5ff39..0779d167 100644
--- a/src/Utility/Path.hs
+++ b/src/Utility/Path.hs
@@ -10,7 +10,6 @@
module Utility.Path where
-import Data.String.Utils
import System.FilePath
import Data.List
import Data.Maybe
@@ -25,10 +24,10 @@ import System.Posix.Files
import Utility.Exception
#endif
-import qualified "MissingH" System.Path as MissingH
import Utility.Monad
import Utility.UserInfo
import Utility.Directory
+import Utility.Split
{- Simplifies a path, removing any "." component, collapsing "dir/..",
- and removing the trailing path separator.
@@ -68,18 +67,6 @@ simplifyPath path = dropTrailingPathSeparator $
absPathFrom :: FilePath -> FilePath -> FilePath
absPathFrom dir path = simplifyPath (combine dir path)
-{- On Windows, this converts the paths to unix-style, in order to run
- - MissingH's absNormPath on them. -}
-absNormPathUnix :: FilePath -> FilePath -> Maybe FilePath
-#ifndef mingw32_HOST_OS
-absNormPathUnix dir path = MissingH.absNormPath dir path
-#else
-absNormPathUnix dir path = todos <$> MissingH.absNormPath (fromdos dir) (fromdos path)
- where
- fromdos = replace "\\" "/"
- todos = replace "/" "\\"
-#endif
-
{- takeDirectory "foo/bar/" is "foo/bar". This instead yields "foo" -}
parentDir :: FilePath -> FilePath
parentDir = takeDirectory . dropTrailingPathSeparator
@@ -89,12 +76,13 @@ parentDir = takeDirectory . dropTrailingPathSeparator
upFrom :: FilePath -> Maybe FilePath
upFrom dir
| length dirs < 2 = Nothing
- | otherwise = Just $ joinDrive drive (intercalate s $ init dirs)
+ | otherwise = Just $ joinDrive drive $ intercalate s $ init dirs
where
- -- on Unix, the drive will be "/" when the dir is absolute, otherwise ""
+ -- on Unix, the drive will be "/" when the dir is absolute,
+ -- otherwise ""
(drive, path) = splitDrive dir
- dirs = filter (not . null) $ split s path
s = [pathSeparator]
+ dirs = filter (not . null) $ split s path
prop_upFrom_basics :: FilePath -> Bool
prop_upFrom_basics dir
@@ -149,11 +137,11 @@ relPathDirToFile from to = relPathDirToFileAbs <$> absPath from <*> absPath to
relPathDirToFileAbs :: FilePath -> FilePath -> FilePath
relPathDirToFileAbs from to
| takeDrive from /= takeDrive to = to
- | otherwise = intercalate s $ dotdots ++ uncommon
+ | otherwise = joinPath $ dotdots ++ uncommon
where
- s = [pathSeparator]
- pfrom = split s from
- pto = split s to
+ pfrom = sp from
+ pto = sp to
+ sp = map dropTrailingPathSeparator . splitPath
common = map fst $ takeWhile same $ zip pfrom pto
same (c,d) = c == d
uncommon = drop numcommon pto
@@ -227,6 +215,8 @@ inPath command = isJust <$> searchPath command
-
- The command may be fully qualified already, in which case it will
- be returned if it exists.
+ -
+ - Note that this will find commands in PATH that are not executable.
-}
searchPath :: String -> IO (Maybe FilePath)
searchPath command
diff --git a/src/Utility/Process.hs b/src/Utility/Process.hs
index ed02f49e..6d981cb5 100644
--- a/src/Utility/Process.hs
+++ b/src/Utility/Process.hs
@@ -174,22 +174,21 @@ createBackgroundProcess p a = a =<< createProcess p
-- returns a transcript combining its stdout and stderr, and
-- whether it succeeded or failed.
processTranscript :: String -> [String] -> (Maybe String) -> IO (String, Bool)
-processTranscript = processTranscript' id
+processTranscript cmd opts = processTranscript' (proc cmd opts)
-processTranscript' :: (CreateProcess -> CreateProcess) -> String -> [String] -> Maybe String -> IO (String, Bool)
-processTranscript' modproc cmd opts input = do
+processTranscript' :: CreateProcess -> Maybe String -> IO (String, Bool)
+processTranscript' cp input = do
#ifndef mingw32_HOST_OS
{- This implementation interleves stdout and stderr in exactly the order
- the process writes them. -}
(readf, writef) <- System.Posix.IO.createPipe
readh <- System.Posix.IO.fdToHandle readf
writeh <- System.Posix.IO.fdToHandle writef
- p@(_, _, _, pid) <- createProcess $ modproc $
- (proc cmd opts)
- { std_in = if isJust input then CreatePipe else Inherit
- , std_out = UseHandle writeh
- , std_err = UseHandle writeh
- }
+ p@(_, _, _, pid) <- createProcess $ cp
+ { std_in = if isJust input then CreatePipe else Inherit
+ , std_out = UseHandle writeh
+ , std_err = UseHandle writeh
+ }
hClose writeh
get <- mkreader readh
@@ -200,12 +199,11 @@ processTranscript' modproc cmd opts input = do
return (transcript, ok)
#else
{- This implementation for Windows puts stderr after stdout. -}
- p@(_, _, _, pid) <- createProcess $ modproc $
- (proc cmd opts)
- { std_in = if isJust input then CreatePipe else Inherit
- , std_out = CreatePipe
- , std_err = CreatePipe
- }
+ p@(_, _, _, pid) <- createProcess $ cp
+ { std_in = if isJust input then CreatePipe else Inherit
+ , std_out = CreatePipe
+ , std_err = CreatePipe
+ }
getout <- mkreader (stdoutHandle p)
geterr <- mkreader (stderrHandle p)
diff --git a/src/Utility/SafeCommand.hs b/src/Utility/SafeCommand.hs
index 5ce17a84..eb34d3de 100644
--- a/src/Utility/SafeCommand.hs
+++ b/src/Utility/SafeCommand.hs
@@ -11,7 +11,7 @@ module Utility.SafeCommand where
import System.Exit
import Utility.Process
-import Data.String.Utils
+import Utility.Split
import System.FilePath
import Data.Char
import Data.List
@@ -86,7 +86,7 @@ shellEscape :: String -> String
shellEscape f = "'" ++ escaped ++ "'"
where
-- replace ' with '"'"'
- escaped = intercalate "'\"'\"'" $ split "'" f
+ escaped = intercalate "'\"'\"'" $ splitc '\'' f
-- | Unescapes a set of shellEscaped words or filenames.
shellUnEscape :: String -> [String]
diff --git a/src/Utility/Scheduled.hs b/src/Utility/Scheduled.hs
index d23aaf03..b68ff901 100644
--- a/src/Utility/Scheduled.hs
+++ b/src/Utility/Scheduled.hs
@@ -29,6 +29,7 @@ module Utility.Scheduled (
import Utility.Data
import Utility.PartialPrelude
import Utility.Misc
+import Utility.Tuple
import Data.List
import Data.Time.Clock
@@ -37,7 +38,6 @@ import Data.Time.Calendar
import Data.Time.Calendar.WeekDate
import Data.Time.Calendar.OrdinalDate
import Data.Time.Format ()
-import Data.Tuple.Utils
import Data.Char
import Control.Applicative
import Prelude
diff --git a/src/Utility/Split.hs b/src/Utility/Split.hs
new file mode 100644
index 00000000..decfe7d3
--- /dev/null
+++ b/src/Utility/Split.hs
@@ -0,0 +1,30 @@
+{- split utility functions
+ -
+ - Copyright 2017 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
+module Utility.Split where
+
+import Data.List (intercalate)
+import Data.List.Split (splitOn)
+
+-- | same as Data.List.Utils.split
+--
+-- intercalate x . splitOn x === id
+split :: Eq a => [a] -> [a] -> [[a]]
+split = splitOn
+
+-- | Split on a single character. This is over twice as fast as using
+-- split on a list of length 1, while producing identical results. -}
+splitc :: Eq c => c -> [c] -> [[c]]
+splitc c s = case break (== c) s of
+ (i, _c:rest) -> i : splitc c rest
+ (i, []) -> i : []
+
+-- | same as Data.List.Utils.replace
+replace :: Eq a => [a] -> [a] -> [a] -> [a]
+replace old new = intercalate new . split old
diff --git a/src/Utility/Tuple.hs b/src/Utility/Tuple.hs
new file mode 100644
index 00000000..25c6e8f3
--- /dev/null
+++ b/src/Utility/Tuple.hs
@@ -0,0 +1,17 @@
+{- tuple utility functions
+ -
+ - Copyright 2017 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+module Utility.Tuple where
+
+fst3 :: (a,b,c) -> a
+fst3 (a,_,_) = a
+
+snd3 :: (a,b,c) -> b
+snd3 (_,b,_) = b
+
+thd3 :: (a,b,c) -> c
+thd3 (_,_,c) = c