Avalon utilizes JSF templating APIs and provides a main template.xhtml along with additional topbar, menu and footer fragments for the base layout. These xhtml files must be placed under WEB-INF folder and client pages should reference the template.xhtml as their template. Provided empty.xhtml is a sample content page using the main template.xhtml that defines "content" as the main ui:define placeholder. By default template defines 3 placeholders (page title, header content and actual content) to insert content and you can add more as per your requirements.
<h:body>
 <ui:include src="./topbar.xhtml" /> <ui:include src="./menu.xhtml" />
 <ui:insert name="content"/>
 <ui:include src="./footer.xhtml" />
 </h:body>
Sample page below uses the main template from Avalon.
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui" template="/WEB-INF/template.xhtml"> <ui:define name="title">Test Page</ui:define> <ui:define name="content"> Content goes here </ui:define> </ui:composition>
Other required resources of the layout are the css, js and images that are located inside resources/avalon-layout folder, simply copy the avalon-layout folder to your %WEB-APP-FOLDER%/resources folder so that final path would be %WEB-APP-FOLDER%/resources/avalon-layout/. Please refer to demo app or maven project of the demo app as the reference.
GuestPreferences is a simple session scoped bean to keep the user customizations of the layout and template xhtml files refer to this bean to dynamically change their behavior such as menu mode or theme. This bean is not necessary to run the Avalon and only used for demo purposes however in your application we suggest using a similar bean so that each user can define their own UI experience by customizing the layout. For example template.xhtml includes layout color depending on a user preference using an EL expression.
<h:outputStylesheet name="css/layout-\#{guestPreferences.layout}.css" library="avalon-layout" />
In your application, you may also need a similar bean to make the template dynamic or choose a static color with;
<h:outputStylesheet name="css/layout-blue.css" library="avalon-layout" />
Source code of GuestPreferences.
public class GuestPreferences implements Serializable { private String theme = "blue"; public String getTheme() { return theme; } public void setTheme(String theme) { this.theme = theme; } }
Avalon provides 15 PrimeFaces themes out of the box, setup of a theme simple as including the theme jar in your classpath and defining primefaces.THEME context parameter in web.xml such as "avalon-green". Full list of available themes are;
A custom theme can be developed by the following steps.
Here are the variables required to create a theme.
$primaryColor:#2EA563; $primaryTextColor:#ffffff; $inputFocusBorderColor:#8CD6AD; $highlightBgColor:#2EA563; $highlightTextColor:#ffffff; $headerBgColor:#f5f5f5; $headerHoverBgColor:#dcdcdc; $headerHoverBorderColor:#c4c4c4; $headerTextColor:#292B2C; $headerBorderColor:#dddddd; $headerIconColor:#999999; $headerIconHoverColor:#777777; $datableEvenRowBgColor:#f9f9f9; $datatableHoverBgColor:#f5f5f5; @import '../sass/theme/_theme';
An example sass command to compile the css would be;
sass src/main/webapp/resources/primefaces-avalon-myown/theme.scss src/main/webapp/resources/primefaces-avalon-myown/theme.css --sourcemap=none
Watch mode is handy to avoid compiling everytime when a change is made, instead use the following command so that sass generates the file whenever you make a customization. This builds all css files whenever a change is made to any scss file.
sass -w src/main/webapp/resources/ --sourcemap=none
Layout customization is similar to theme method.
Here are the variables required to create a layout.
$topbarLeftGradientStartBgColor:#ff8f00; $topbarLeftGradientEndBgColor:#ffb300; $topbarRightGradientStartBgColor:#ff8f00; $topbarRightGradientEndBgColor:#ffb300; $topbarTextColor:#ffffff; $menuGradientStartBgColor:#ffffff; $menuGradientEndBgColor:#ffffff; $menuitemHoverBgColor:#e8e8e8; $menuitemActiveColor: #ff8f00; $menuitemActiveBgColor:#e8e8e8; $menuButtonBgColor:#ffffff; $menuButtonColor:#ff6f00; $badgeBgColor:#3eb839; $badgeColor:#ffffff; $darkMenuGradientStartBgColor:#363a41; $darkMenuGradientEndBgColor:#363a41; $darkMenuHoverBgColor:#4a4d54; $darkMenuMenuitemColor:#ffffff; $darkMenuMenuitemActiveColor:#ffe57f; $darkMenuMenuitemActiveBgColor:#282b30; @import '../../sass/layout/_layout';
In case you'd like to customize common variables, the _common.scss under sass variables folder is where the core variables (e.g. font size, paddings) for the layout are defined.
$fontFamily:"Helvetica Neue",Helvetica,Arial,sans-serif; $fontSize:14px; $bodyBgColor:#EEF2F6; $textColor:#292B2C; $textSecondaryColor:#777777; $borderRadius:4px; $dividerColor:#e5e5e5; $transitionDuration:.3s; $disabledBgColor:#eeeeee; /* Predefined Colors */ $lightestGray:#f5f5f5; $lightGray:#cccccc; $gray:#999999; $darkGray:#777777; $white:#ffffff; $blue:#337ab7; $purple:#9189fd; $orange:#ffbf79; $lightBlue:#8dc8ff; $pink:#f790c8; $green:#3e9018; $red:#da2f31; $orange:#ffb200; $teal:#599597; $black:#000000; $yellow:#ffd644;
_layout.scss under variables define the shared variables of the layout.
@import './common'; $backgroundColor:#424242; $menuHoverBgColor:#f4f4f4;
Similarly _theme.scss files contains the shared variables of the PrimeFaces theme.
@import './common'; /* Icons */ $iconFontSize:14px; $iconWidth:16px; /* Error */ $errorColor:#a94442; $disabledColor:#eeeeee; /* Headers */ $headerPadding:10px 15px; /* Contents */ $contentPadding:15px; $contentBorderColor:#dddddd; $contentBgColor:#ffffff; $contentLineHeight:1.43; /* Forms */ $inputBgColor:#ffffff; $inputPadding:6px 12px; $inputBorderColor:#cccccc; $inputHoverBorderColor:#cccccc; /* Buttons */ $buttonTextColor:#ffffff; $toggleButtonBgColor:#ffffff; $toggleButtonBorderColor:#cccccc; $toggleButtonHoverBgColor:#e6e6e6; $toggleButtonHoverBorderColor:#adadad; /* List Items */ $listItemPadding:6px 20px; $listItemHoverBgColor:#f5f5f5; $listItemHoverTextColor:#292B2C; /* Messages */ $infoMessageBgColor:#d9edf7; $infoMessageBorderColor:#bce8f1; $infoMessageTextColor:#31708f; $warnMessageBgColor:#fcf8e3; $warnMessageBorderColor:#faebcc; $warnMessageTextColor:#8a6d3b; $errorMessageBgColor:#f2dede; $errorMessageBorderColor:#ebccd1; $errorMessageTextColor:#a94442; $fatalMessageBgColor:#999999; $fatalMessageBorderColor:#6b6b6b; $fatalMessageTextColor:#ffffff; /* Overlays */ $overlayBorderColor:#cccccc; /* Data */ $datatableCellBorderColor:#dddddd; $datatableCellPadding:8px; $paginatorBgColor:#ffffff; /* Panel */ $panelContentBorderColor:#DCE1E7;
Menu is a regular JSF component that supports PrimeFaces MenuModel API allowing both declarative and programmatic approaches.
xmlns:pa="http://primefaces.org/avalon" <pa:menu> </pa:menu>
Menu has 4 modes; static, overlay, horizontal and slim. Layout wrapper element in template.xhtml is used to define which mode to use by adding specific classes.
Layout mode can be dynamic using an EL expression as well using an example bean called userPreferences.

 ...

Avalon Layout uses font awesome icons for layout so enable font awesome support in PrimeFaces by setting primefaces.FONT_AWESOME context parameter in web.xml as true. If your PrimeFaces version does not have the font awesome integration, include the font-awesome manually in your application.
Card is a section to group content and layout provides a built-in css for it. Apply .card style class to your container to use it. If the card has a title defined with h1 tag, add card-w-title to adjust paddings.

 Content here

Card with Title
 Content here

Avalon uses new PrimeFaces Grid CSS (ui-g-*) throughout the samples, we strongly suggest using Grid CSS as your layout framework as it is well tested and supported by PrimeFaces. Grid CSS is automatically included on newer versions however if your PrimeFaces version is older than 5.3.14, add the provided grid.css file under /avalon-layout/css/ folder to your template manually.


How Gears 5 was inspired by Super Mario Galaxy
by Carrie TalbotGears 5 and Super Mario Galaxy might not appear to have much in common – one being a gritty shooter about an emerging all-out war, and the other an Italian plumber’s quest to save Princess Peach and collect lots of stars. However, according to Gears 5 developer The Coalition’s studio head, a key aspect of the game was inspired by the 2007 Mario adventure.
Speaking at the Montreal International Game Summit (via GamesIndustry.biz), The Coalition’s Rod Fergusson talked about creating a multiplayer co-op game mode with Jack, the hovering robot support character. In doing this, Fergusson said, the devs took inspiration from Super Mario Galaxy.
The Nintendo Wii game allows a second player to hop in and use the Remote controller to grab bits of stars and blast them at foes, giving Mario some backup and lending some extra firepower. It sounds like this idea fed into how Jack works as a support character, who is mainly cloaked in the co-op Horde mode but can step in to help out, dealing some damage (and stealthy surprises) with his zapper, and area-of-effect abilities.
“We purposely created this character whose abilities and movement were the exact opposite of what the main game is like, so that it would have a different way of playing,” Fergusson said of Jack, adding that the character had been welcomed by new and core Gears players alike.
“That was a big part of the ecosystem. We took something most beginners would play in Jack, and now Jack is wanted,” he said. “People would welcome a Jack player – ‘Play with us, we need a Jack!’ – so it made it a lot more friendly and welcoming ecosystem.”
In other news Gears 5 has now outsold Gears 4, even though it’s on Game Pass (an Xbox subscription service which now also has a PC version).


| Cost | Service | Description |
|---|---|---|
| 20$ | Dog Break | 20 Minute Visit for a potty break, dinner trip or just some good old fashioned attention |
| 50$ | Dog Daze | 3 daily visits to make sure your dog is well taken care of while you're away. |
| 100$ | DogFucius Stay | 3 Daily visits and an overnight stay for you and your pets maximum comfort and well being. |
| 50$ | Dogorazi | Pro Photoshoot with your dog! On location/ costumes optional. |


"You are Just a click away from your quote,click on the "New" button bellow."
Ashish verma.
reserved with teen2geek.wordpress.com


Flights
Subtitle One
From booking tools to travel management to back-office support, we have a bouquet of world-class standards-compliant travel technology tools that streamline and optimise your travel programme. We are constantly researching and investing in new travel technology to give your business access to cutting-edge tools in booking and managing your travel, and ensuring your travellers’ safety and well being.


Fill in the sections as accurately as possible, or you risk losing your soul mate and walk the Earth alone forever!
| What the devil are you? |
|||
| What is the best icecream topping? |
|||
| Three Words To Describe Yourself |
|||
| What is your email? IF you get a match, we'll let you know. Then you decide if you date or ditch. |


--- layout: archive title: Zulip Chat Archive permalink: /stream/113488-general/topic/Bundled.20.60sub*.60.20and.20.60center.60.html ---
How should we handle, e.g., center
once we'll have bundled submonoid
, subgroup
, subring
, subalgebra
, ...? Should it be sub*.center
with lemmas like subgroup.center.to_submonoid = submonoid.center
? Or should we continue using center M : set M
with [is_sub* (center M)]
? Something else?
Similar question about, e.g., mul_action.restrict [mul_action M α] (s : set M) [is_submonoid s] : mul_action s α
.
Last updated: Apr 24 2020 at 19:02 UTC


--- layout: landingpage title: aszel.com --- Welcome I am Martin and I do stuff. This here is my playground in the interwebs.


TABLE OF INTERACTIONS WITH
LOW MOLECULAR WEIGHT HEPARINS AND RELATED DRUGS (PREVENTIVE DOSES)
In the case of their use in preventive doses (except for older patients), the use of medications acting at various levels of hemeostasis increases the risk of bleeding.
Thus, with younger patients, administering heparin or related molecules, in preventive treatment, with oral anticoagulants, platelet aggregation inhibitors, or thrombolitics, must be taken into account by maintaining regular clinical monitoring, and, if the situation requires, biological monitoring.
From the French ANSM drug interactions document of
September 2016, pp. 106-107
LOW MOLECULAR WEIGHT HEPARINS AND RELATED DRUGS (PREVENTIVE DOSES) CLASS CODE: B01AB-002 |
ACETYLSALICYLIC ACID RxNorm: 1191 ATC: A01AD05 B01AC06 N02BA01 |
The combination of medications acting at different levels of hemeostasis increases the risk of bleeding. Thus, with patients under 65 years of age, adding heparin or similar substances in preventive doses to acetylsalicylic acid, whatever the dosage, must be taken into account by maintaining clinical and possibly biological monitoring. |
Take into account |
LOW MOLECULAR WEIGHT HEPARINS AND RELATED DRUGS (PREVENTIVE DOSES) CLASS CODE: B01AB-002 |
NON STEROIDAL ANTI-INFLAMMATORY DRUGS CLASS CODE: M01A-002 |
Increase of the risk of hemorrhage |
Take into account |


{% extends "layout.html" %} {% block body %}
Imeall
(IM-UHLL)
The Imeall computational package has been developed for the calculation and indexing of atomistic properties
of grain boundaries in materials. The package provides a structured database for the storage of atomistic structures and
their associated properties, equipped with an interface to interatomic potential calculators.
The database adopts a general indexing system that allows for the storage of arbitrary grain boundary structures
for any crystalline material. The package repository can be found here
and the documentation can be found here.
Imeall
Naming ConventionsThe grain boundaries are generated and labeled according to a uniform process indicated by the following notation:
[XXX]Theta(YYY)
Theta is the angle of misorientation in degrees around the orientation axis [XXX]. The boundary plane (YYY) determines the plane of the interface between the misoriented Grain A and Grain B. The concatenated string is referred to as the gbid. In this way it is possible to uniquely characterize all grain boundaries. Grain boundaries characterized by these three quantities are considered "canonical" GrainBoundaries.
An additional set of three degrees of freedom is then used to extend the above definition. The additional degrees of freedom correspond to a rigid body translation in the two dimensional plain of the grain boundary, one relative to the other, and a volume relaxation orthogonal to the grain boundary plane. A full range of atomic deletion criterion must also be explored in this "SubGrainBoundary" space to access the minimum energy structure for a given potential. These atomic scale degrees of freedom compose subgrains of the canonical parent grain. Subgrains are stored in a hierarchical format below the canonical grain.
Finally, we assign the idealized crystalline bulk structure the notation:
0000000000
The structures are stored locally in the database as extended XYZ files.
Locally the Imeall
server can be accessed through your browser at http://<IP_ADDRESS>:5000/.
The home page contains a list of links for each material in the database under:
Local Database.Each link leads to a view of different orientation axes vectors for which grain boundary properties have been computed.
For instance:
/alphaFe/110
contains all computed misorientations around [110]
grain boundaries for BCC iron. The [000] orientation axes is a catch all directory that contains
calculations pertaining to a perfect crystal, fracture simulations along different cleavage
planes and singular defects and vacancies in a perfect crystal which may be of use with reference
to the grain boundary structures.
Within each orientation axis is a list of full canonical GrainBoundaries. Each of these GrainBoundaries contains a snap shot of the unrelaxed grain boundary structure (the canonical boundary), the coincident site lattice, and a list of sub-directories containing the type of calculations performed for the SubGrainBoundaries (the atomistic models). Examples of calculation types include: tight binding models, EAMs, DFT, etc. If multiple "flavours" of each calculation type are to be used the directories can take more specific names: EAM_Mishin, DFT_PZ, DFT_PBE etc. Within each calc_type of directories is the pattern gbid_'suffix'. These subdirectories are considered "Subgrains" of the canonical grain.
_d2.0
which denotes: delete one of a pair of atoms from the original grain boundary
structure with nearest neighbour distance less than or equal to 2 Å.
Another suffix pattern might be displace the canonical grain along the in-plane lattice vectors by a
distance 0.25*lattice vector: _tv0.25bxv0.25
. Suffices can be
combined: _tv0.25bxv0.25_d2.0
. A key for some common suffix patterns is given here:
_v2bxv6 : supercell 2 times along orientation axis 6 times along the normal to the orientation axis.
_tv0.13bxv0.25 : displace one grain 0.13*v along v and 0.25*bxv along bxv.
_d2.0z : delete one of pair of atoms within distance 2.0 Å of each other.
_h2.0n1 : 1 additional hydrogen atom in system 2.0 Å from a grainboundary.
Systematic use of these naming conventions ensures that at the analysis stage grain boundary properties can be retrieved, compared, and combined easily.
The canonical grain contains a file:
gb.json
subsequent directories each contain a file:
subgb.json
This json file contains information about relevant grain boundary properties in the usual key:value format. Some common keys are:
E_gb_init : Unrelaxed Grain Boundary Energy.
E_gb : Relaxed Grain Boundary Energy.
n_at : Number of atoms in the grain boundary.
A : Grain Boundary area in the unit cell.
Upon subsequent analysis new key:values pairs can be added to the json dictionaries as required. Either by directly editing the json file or through the python API when new calculations are performed.
A subgrain directory may also contain a directory labeled /PH/
. This directory contains
calculations pertaining to vibrational properties of the system: i.e.
the phonon density of states, bandstructures,
and free energies/entropies determined within the quasiharmonic approximation.
Again calculations are organized by the calc_type property (EAM, TB, DFT).
Vibrational properties are typically calculated using
the phonopy code. Force constant matrices
can also be stored in the /PH/ sub-directories.
The /000/
directory contains many "subgrains" of the unperturbed ideal crystal.
This directory is likely to contain isolated edge and screw dislocations, fracture simulations
along different cleavage planes, ɣ-surface calculations for different glide planes,
vibrational properties of the ideal crystal, and all the same again for the
ideal crystal with defects or interstitials. Dislocations, defects, and
fracture simulations in the presence of grainboundaries should be stored as
subgrains under the appropriate canonical grainboundary database.
All structures and parameter files in the database can be downloaded. The local database contains the following materials:
{{material}}


Synthea creates soundboards for realtime playback of sound effects, ambience, and music. Its easy-to-use interface makes it an accessible solution to any live production, while its powerful features provide deep customization and precision for advanced users.
Some key features include:
Convenient QueuingLine up sound cues in advance to play back when you need them— on demand, sequentially, or all at once.
Automatic CrossfadingWhen a sound cue is paused or stopped, Synthea automatically fades the sound out so you don't have to think about it. With realtime board switches and cue-specific settings, you can choose on-the-fly whether new cues fade in or start at full volume.
Smart SubgroupsTag sound cues to different "subgroups" to control overlays. Cues in the same subgroup replace one another, while cues in different subgroups play concurrently.
Individual Playback ControlsEach sound cue, whether playing or queued up, has individual controls for play, pause, seek, and loop. Complete control is at your fingertips.
HotkeysProgram keyboard shortcuts to frequently-used sound cues so you can play them instantly no matter where you are on the board.
File RandomizationAttach multiple sound files to a single cue for randomized, non-repeating playback. Each time you hit the cue, a different file will play—for a more immersive experience.
Scalable, Searchable, Tab-Based InterfaceHandle dozens or even hundreds of sound cues in a project with Synthea's easy board layout. A global search is just a keypress away, so you can find any cue you want in seconds.
In unscripted theater, a sound board operator needs to access effects and music in ways that scripted theater software simply can't handle. Programs like QLab and Show Cue Systems can be powerful when audio playback is carefully planned and played in sequence, but are too cumbersome for the unpredictable, seat-of-your-pants sound design of improvisation and unscripted theater.
As a tech improviser, I once needed the ability to engage in realtime, unscripted conversation between performers onstage and an "artificial intelligence" controlled by me in the booth. The AI's dialogue would need to be synthesized from pre-recorded sentence fragments, which would require software to assemble the cues on-the-fly and play them back seamlessly in real-time.
Unable to find any soundboard software capable of this task, I wrote the first version of Synthea to do just that. I immediately saw the value this software could provide beyond synthesizing dialogue, and since then Synthea has expanded to provide customized music and sound effects boards for dozens of other plays, variety shows, and improv performances around the world.
The software is still in its infancy, but for those ready to try it out, I hope Synthea proves to be a useful tool.


--- layout: post date: 2011-01-06 time: "10:00:00" authors: ["Greg Wilson"] title: What I Learned From Software Carpentry tags: ["UK Met Office"] ---
Anna Maidens, who works for the UK Met Office in Exeter and took part in our October 2010 Software Carpentry course there, did a presentation a few weeks ago to her team about what she learned. She has kindly given permission for us to post those slides; as always, we're eager to hear what other people have taken away from the course as well.


--- layout: page title: 2015 ACF Regionals A-values date: 2015-01-26 05:47:12.000000000 -06:00 type: page parent_id: '711' published: true password: '' status: publish categories: [] tags: [] meta: _publicize_pending: '1' geo_public: '0' _wp_page_template: default _edit_last: '16309375' author: login: acfquizbowl email<EMAIL_ADDRESS>display_name: acfquizbowl first_name: '' last_name: '' permalink: "/archives/archived-tournament-announcements/acf-regionals-2015/2015-acf-regionals-a-values/" ---
A-values for teams that played the 2015 ACF Regionals are listed in the table below. Team will be invited to play 2015 ACF Nationals at the University of Michigan based on their A-values. Details of A-value calculations are announced here.
Please contact 2015 ACF Nationals Tournament Director Matt Weiner or ACF Communications Officer Stephen Eltinge with questions.
These teams have been granted Automatic Bids:
Harvard University, Rice University, Stanford University, University of Alberta, University of Oxford.
Teams in blue background qualified by winning their site. Teams in yellow highlights qualified as the top-placing Undergraduate team at a site with four or more Undergraduate teams. Teams are sorted in descending order of A-value. To view the raw-data that went into A-value calculations, please click on the "calculations" tab.
[googleapps domain="docs" dir="spreadsheets/d/1VYOect1f9yQodnJfBSP5So54uQXiMxJA86kqXArIJxA/pubhtml" query="widget=true&headers=false" width="600" height="600" /]


The REST API Plugin provides the ability to manage Openfire by sending an REST/HTTP request to the server. This plugin’s functionality is useful for applications that need to administer Openfire outside of the Openfire admin console.
REST API clients are implementations of the REST API in a specific programming language.
Copy restAPI.jar into the plugins directory of your Openfire server. The plugin will be automatically deployed. To upgrade to a newer version, overwrite the restAPI.jar file with the new one.
To provide a standard way of accessing the data the plugin is using REST.
| HTTP Method | Usage |
|---|---|
| GET | Receive a read-only data |
| PUT | Overwrite an existing resource |
| POST | Creates a new resource |
| DELETE | Deletes the given resource |
All REST Endpoint are secured and must be authenticated. There are two ways to authenticate:
The configuration can be done in Openfire Admin console under Server > Server Settings > REST API.
To access the endpoints is that required to send the Username and Password of a Openfire Admin account in your HTTP header request.
E.g. Header: Authorization: Basic YWRtaW46MTIzNDU= (username: admin / password: 12345)
To access the endpoints is that required to send the secret key in your header request.
The secret key can be defined in Openfire Admin console under Server > Server Settings > REST API.
E.g. Header: Authorization: s3cretKey
Endpoint to get all or filtered users
GET /users
Payload: none
Return value: Users
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| search | @QueryParam | Search/Filter by username. This act like the wildcard search %String% |
|
| propertyKey | @QueryParam | Filter by user propertyKey. | |
| propertyValue | @QueryParam | Filter by user propertyKey and propertyValue. Note: It can only be used within propertyKey parameter |
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/users
GET http://example.org:9090/plugins/restapi/v1/users?search=testuser
GET http://example.org:9090/plugins/restapi/v1/users?propertyKey=keyname
GET http://example.org:9090/plugins/restapi/v1/users?propertyKey=keyname&propertyValue=keyvalue
If you want to get a JSON format result, please add “Accept: application/json” to the Header.
Endpoint to get information over a specific user
GET /users/{username}
Payload: none
Return value: User
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username |
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/users/testuser
Endpoint to create a new user
POST /users
Payload: User
Return value: HTTP status 201 (Created)
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type: application/xml
Payload Example 1 (required parameters):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
<username>test3</username>
<password>p4ssword</password>
</user>
Payload Example 2 (available parameters):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
<username>testuser</username>
<password>p4ssword</password>
<name>Test User</name>
<EMAIL_ADDRESS><properties>
<property key="keyname" value="value"/>
<property key="anotherkey" value="value"/>
</properties>
</user>
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type: application/json
Payload Example 1 (required parameters):
{
"username": "admin",
"password": "p4ssword"
}
Payload Example 2 (available parameters):
{
"username": "admin",
"password": "p4ssword",
"name": "Administrator",
"email"<EMAIL_ADDRESS>"properties": {
"property": [
{
"@key": "console.rows_per_page",
"@value": "user-summary=8"
},
{
"@key": "console.order",
"@value": "session-summary=1"
}
]
}
}
REST API Version 1.3.0 and later - Payload Example 2 (available parameters):
{
"users": [
{
"username": "admin",
"name": "Administrator",
"email"<EMAIL_ADDRESS>"password": "p4ssword",
"properties": [
{
"key": "console.order",
"value": "session-summary=0"
}
]
},
{
"username": "test",
"name": "Test",
"password": "p4ssword"
}
]
}
Endpoint to pair users (with their devices)
POST /users/roster/multipairing
Payload: User
Return value: HTTP status 201 (Created)
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type: application/xml
POST http://example.org:9090/plugins/restapi/v1/users/roster/multipairing
Payload Example (required parameters):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<items>
<itemToPairEntity>
<user1DeviceXmppLogin>testUser</user1DeviceXmppLogin>
<user2DeviceXmppLogin>testUser2</user2DeviceXmppLogin>
<user1DeviceName>testuserDeviceName</user1DeviceName>
<user2DeviceName>testuser2DeviceName</user2DeviceName>
</itemToPairEntity>
</items>
Endpoint to unpair users (also unpair their devices)
DELETE /users/roster/multipairing
Payload: User
Return value: HTTP status 200 (OK)
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type: application/xml
DELETE http://example.org:9090/plugins/restapi/v1/users/roster/multipairing
Payload Example (required parameters):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<items>
<itemToUnpairEntity>
<user1DeviceXmppLogin>testUser</user1DeviceXmppLogin>
<user2DeviceXmppLogin>testUser2</user2DeviceXmppLogin>
</itemToUnpairEntity>
</items>
Endpoint to delete a user
DELETE /users/{username}
Payload: none
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username |
Header: Authorization: Basic YWRtaW46MTIzNDU=
DELETE http://example.org:9090/plugins/restapi/v1/users/testuser
Endpoint to update / rename a user
PUT /users/{username}
Payload: User
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
PUT http://example.org:9090/plugins/restapi/v1/users/testuser
Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
<username>testuser</username>
<name>Test User edit</name>
<EMAIL_ADDRESS><properties>
<property key="keyname" value="value"/>
</properties>
</user>
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
PUT http://example.org:9090/plugins/restapi/v1/users/oldUsername
Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
<username>newUsername</username>
<name>Test User edit</name>
<EMAIL_ADDRESS><properties>
<property key="keyname" value="value"/>
</properties>
</user>
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/json
PUT http://example.org:9090/plugins/restapi/v1/users/testuser
Payload:
{
"username": "testuser",
"name": "Test User edit",
"email"<EMAIL_ADDRESS>"properties": {
"property": {
"@key": "keyname",
"@value": "value"
}
}
}
REST API Version 1.3.0 and later - Payload Example 2 (available parameters):
{
"username": "testuser",
"name": "Test User edit",
"email"<EMAIL_ADDRESS>"properties": [
{
"key": "keyname",
"value": "value"
}
]
}
Endpoint to get group names of a specific user
GET /users/{username}/groups
Payload: none
Return value: Groups
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username |
Header: Authorization: Basic YWRtaW46MTIzNDU=
**GET ** http://example.org:9090/plugins/restapi/v1/users/testuser/groups
Endpoint to add user to a groups
POST /users/{username}/groups
Payload: Groups
Return value: HTTP status 201 (Created)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
POST http://example.org:9090/plugins/restapi/v1/users/testuser/groups
Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<groups>
<groupname>Admins</groupname>
<groupname>Support</groupname>
</groups>
Endpoint to add user to a group
POST /users/{username}/groups/{groupName}
Payload: none
Return value: HTTP status 201 (Created)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username | |
| groupName | @Path | Exact group name |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
POST http://example.org:9090/plugins/restapi/v1/users/testuser/groups/testGroup
Endpoint to remove a user from a groups
DELETE /users/{username}/groups
Payload: Groups
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
DELETE http://example.org:9090/plugins/restapi/v1/users/testuser/groups
Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<groups>
<groupname>Admins</groupname>
<groupname>Support</groupname>
</groups>
Endpoint to remove a user from a group
DELETE /users/{username}/groups/{groupName}
Payload: none
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username | |
| groupName | @Path | Exact group name |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
DELETE http://example.org:9090/plugins/restapi/v1/users/testuser/groups/testGroup
Endpoint to lockout / ban the user from the chat server. The user will be kicked if the user is online.
POST /lockouts/{username}
Payload: none
Return value: HTTP status 201 (Created)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username |
Header: Authorization: Basic YWRtaW46MTIzNDU=
POST http://example.org:9090/plugins/restapi/v1/lockouts/testuser
Endpoint to unlock / unban the user
DELETE /lockouts/{username}
Payload: none
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username |
Header: Authorization: Basic YWRtaW46MTIzNDU=
DELETE http://example.org:9090/plugins/restapi/v1/lockouts/testuser
Endpoint to get roster entries (buddies) from a specific user
GET /users/{username}/roster
Payload: none
Return value: Roster
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username |
Header: Authorization: Basic YWRtaW46MTIzNDU=
**GET ** http://example.org:9090/plugins/restapi/v1/users/testuser/roster
Endpoint to add a new roster entry to a user
POST /users/{username}/roster
Payload: RosterItem
Return value: HTTP status 201 (Created)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
POST http://example.org:9090/plugins/restapi/v1/users/testuser/roster
Payload:
Payload Example 1 (required parameters):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rosterItem>
<EMAIL_ADDRESS></rosterItem>
Payload Example 2 (available parameters):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rosterItem>
<EMAIL_ADDRESS><nickname>Peter1</nickname>
<subscriptionType>3</subscriptionType>
<groups>
<group>Friends</group>
</groups>
</rosterItem>
Endpoint to remove a roster entry from a user
DELETE /users/{username}/roster/{jid}
Payload: none
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username | |
| jid | @Path | JID of the roster item |
Header: Authorization: Basic YWRtaW46MTIzNDU=
DELETE<EMAIL_ADDRESS>Endpoint to update a roster entry
PUT /users/{username}/roster/{jid}
Payload: RosterItem
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | Exact username | |
| jid | @Path | JID of the roster item |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
PUT<EMAIL_ADDRESS>Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rosterItem>
<EMAIL_ADDRESS><nickname>Peter Pan</nickname>
<subscriptionType>0</subscriptionType>
<groups>
<group>Support</group>
</groups>
</rosterItem>
Endpoint to get all chat rooms
GET /chatrooms
Payload: none
Return value: Chatrooms
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| servicename | @QueryParam | The name of the Group Chat Service | conference |
| type | @QueryParam | public: Only as List Room in Directory set rooms all: All rooms. |
public |
| search | @QueryParam | Search/Filter by room name. This act like the wildcard search %String% |
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/chatrooms
GET http://example.org:9090/plugins/restapi/v1/chatrooms?type=all
GET http://example.org:9090/plugins/restapi/v1/chatrooms?type=all&servicename=privateconf
GET http://example.org:9090/plugins/restapi/v1/chatrooms?search=test
Endpoint to get information over specific chat room
GET /chatrooms/{roomName}
Payload: none
Return value: Chatroom
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| roomname | @Path | Exact room name | |
| servicename | @QueryParam | The name of the Group Chat Service | conference |
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/chatrooms/test
GET http://example.org:9090/plugins/restapi/v1/chatrooms/test?servicename=privateconf
Endpoint to get all participants with a role of specified room.
GET /chatrooms/{roomName}/participants
Payload: none
Return value: Participants
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| roomname | @Path | Exact room name | |
| servicename | @QueryParam | The name of the Group Chat Service | conference |
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/chatrooms/room1/participants
Endpoint to get all occupants (all roles / affiliations) of a specified room.
GET /chatrooms/{roomName}/occupants
Payload: none
Return value: Occupants
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| roomname | @Path | Exact room name | |
| servicename | @QueryParam | The name of the Group Chat Service | conference |
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/chatrooms/room1/occupants
Endpoint to create a new chat room.
POST /chatrooms
Payload: Chatroom
Return value: HTTP status 201 (Created)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| servicename | @QueryParam | The name of the Group Chat Service | conference |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type: application/xml
Payload Example 1 (required parameters):
<chatRoom>
<naturalName>global-1</naturalName>
<roomName>global</roomName>
<description>Global Chat Room</description>
</chatRoom>
Payload Example 2 (available parameters):
<chatRoom>
<roomName>global</roomName>
<naturalName>global-2</naturalName>
<description>Global Chat Room</description>
<subject>global-2 Subject</subject>
<creationDate>2014-02-12T15:52:37.592+01:00</creationDate>
<modificationDate>2014-09-12T15:35:54.702+02:00</modificationDate>
<maxUsers>0</maxUsers>
<persistent>true</persistent>
<publicRoom>true</publicRoom>
<registrationEnabled>false</registrationEnabled>
<canAnyoneDiscoverJID>false</canAnyoneDiscoverJID>
<canOccupantsChangeSubject>false</canOccupantsChangeSubject>
<canOccupantsInvite>false</canOccupantsInvite>
<canChangeNickname>false</canChangeNickname>
<logEnabled>true</logEnabled>
<loginRestrictedToNickname>false</loginRestrictedToNickname>
<membersOnly>false</membersOnly>
<moderated>false</moderated>
<broadcastPresenceRoles>
<broadcastPresenceRole>moderator</broadcastPresenceRole>
<broadcastPresenceRole>participant</broadcastPresenceRole>
<broadcastPresenceRole>visitor</broadcastPresenceRole>
</broadcastPresenceRoles>
<owners>
<owner>owner@localhost</owner>
</owners>
<admins>
<admin>admin@localhost</admin>
</admins>
<members>
<member>member2@localhost</member>
<member>member1@localhost</member>
</members>
<outcasts>
<outcast>outcast1@localhost</outcast>
</outcasts>
</chatRoom>
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type: application/json
Payload Example 1 (required parameters):
{
"roomName": "global",
"naturalName": "global-2",
"description": "Global chat room"
}
Payload Example 2 (available parameters):
{
"roomName": "global-1",
"naturalName": "global-1_test_hello",
"description": "Global chat room",
"subject": "Global chat room subject",
"creationDate": "2012-10-18T16:55:12.803+02:00",
"modificationDate": "2014-07-10T09:49:12.411+02:00",
"maxUsers": "0",
"persistent": "true",
"publicRoom": "true",
"registrationEnabled": "false",
"canAnyoneDiscoverJID": "true",
"canOccupantsChangeSubject": "false",
"canOccupantsInvite": "false",
"canChangeNickname": "false",
"logEnabled": "true",
"loginRestrictedToNickname": "true",
"membersOnly": "false",
"moderated": "false",
"broadcastPresenceRoles": {
"broadcastPresenceRole": [
"moderator",
"participant",
"visitor"
]
},
"owners": {
"owner": "owner@localhost"
},
"admins": {
"admin": [
"admin@localhost",
"admin2@localhost"
]
},
"members": {
"member": [
"member@localhost",
"member2@localhost"
]
},
"outcasts": {
"outcast": [
"outcast@localhost",
"outcast2@localhost"
]
}
}
REST API Version 1.3.0 and later - Payload Example 2 (available parameters):
{
"roomName": "global-1",
"naturalName": "global-1_test_hello",
"description": "Global chat room",
"subject": "Global chat room subject",
"creationDate": "2012-10-18T16:55:12.803+02:00",
"modificationDate": "2014-07-10T09:49:12.411+02:00",
"maxUsers": "0",
"persistent": "true",
"publicRoom": "true",
"registrationEnabled": "false",
"canAnyoneDiscoverJID": "true",
"canOccupantsChangeSubject": "false",
"canOccupantsInvite": "false",
"canChangeNickname": "false",
"logEnabled": "true",
"loginRestrictedToNickname": "true",
"membersOnly": "false",
"moderated": "false",
"broadcastPresenceRoles": [
"moderator",
"participant",
"visitor"
],
"owners": [
"owner@localhost"
],
"admins": [
"admin@localhost"
],
"members": [
"member@localhost"
],
"outcasts": [
"outcast@localhost"
]
}
Endpoint to delete a chat room.
DELETE /chatrooms/{roomName}
Payload: none
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| roomname | @Path | Exact room name | |
| servicename | @QueryParam | The name of the Group Chat Service | conference |
Header: Authorization: Basic YWRtaW46MTIzNDU=
DELETE http://example.org:9090/plugins/restapi/v1/chatrooms/testroom
DELETE http://example.org:9090/plugins/restapi/v1/chatrooms/testroom?servicename=privateconf
Endpoint to update a chat room.
PUT /chatrooms/{roomName}
Payload: Chatroom
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| roomname | @Path | Exact room name | |
| servicename | @QueryParam | The name of the Group Chat Service | conference |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
PUT http://example.org:9090/plugins/restapi/v1/chatrooms/global
Payload:
<chatRoom>
<roomName>global</roomName>
<naturalName>global-2</naturalName>
<description>Global Chat Room edit</description>
<subject>New subject</subject>
<password>test</password>
<creationDate>2014-02-12T15:52:37.592+01:00</creationDate>
<modificationDate>2014-09-12T14:20:56.286+02:00</modificationDate>
<maxUsers>0</maxUsers>
<persistent>true</persistent>
<publicRoom>true</publicRoom>
<registrationEnabled>false</registrationEnabled>
<canAnyoneDiscoverJID>false</canAnyoneDiscoverJID>
<canOccupantsChangeSubject>false</canOccupantsChangeSubject>
<canOccupantsInvite>false</canOccupantsInvite>
<canChangeNickname>false</canChangeNickname>
<logEnabled>true</logEnabled>
<loginRestrictedToNickname>false</loginRestrictedToNickname>
<membersOnly>false</membersOnly>
<moderated>false</moderated>
<broadcastPresenceRoles/>
<owners>
<owner>owner@localhost</owner>
</owners>
<admins>
<admin>admin@localhost</admin>
</admins>
<members>
<member>member2@localhost</member>
<member>member1@localhost</member>
</members>
<outcasts>
<outcast>outcast1@localhost</outcast>
</outcasts>
</chatRoom>
Endpoint to add a new user with role to a room.
POST /chatrooms/{roomName}/{roles}/{name}
Payload: none
Return value: HTTP status 201 (Created)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| roomname | @Path | Exact room name | |
| name | @Path | The local username or the user JID | |
| roles | @Path | Available roles: owners admins members outcasts |
|
| servicename | @QueryParam | The name of the Group Chat Service | conference |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
POST http://example.org:9090/plugins/restapi/v1/chatrooms/global/owners/testUser
POST<EMAIL_ADDRESS>POST http://example.org:9090/plugins/restapi/v1/chatrooms/global/admins/testUser
POST http://example.org:9090/plugins/restapi/v1/chatrooms/global/members/testUser
POST http://example.org:9090/plugins/restapi/v1/chatrooms/global/outcasts/testUser
POST http://example.org:9090/plugins/restapi/v1/chatrooms/global/owners/testUser?servicename=privateconf
Endpoint to add a new group with role to a room.
POST /chatrooms/{roomName}/{roles}/group/{name}
Payload: none
Return value: HTTP status 201 (Created)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| roomname | @Path | Exact room name | |
| name | @Path | The group name | |
| roles | @Path | Available roles: owners admins members outcasts |
|
| servicename | @QueryParam | The name of the Group Chat Service | conference |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
POST http://example.org:9090/plugins/restapi/v1/chatrooms/global/owners/group/testGroup
POST http://example.org:9090/plugins/restapi/v1/chatrooms/global/admins/group/testGroup
POST http://example.org:9090/plugins/restapi/v1/chatrooms/global/members/group/testGroup
POST http://example.org:9090/plugins/restapi/v1/chatrooms/global/outcasts/group/testGroup
POST http://example.org:9090/plugins/restapi/v1/chatrooms/global/owners/group/testUser?servicename=privateconf
Endpoint to remove a room user role.
DELETE /chatrooms/{roomName}/{roles}/{name}
Payload: none
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| roomname | @Path | Exact room name | |
| name | @Path | The local username or the user JID | |
| roles | @Path | Available roles: owners admins members outcasts |
|
| servicename | @QueryParam | The name of the Group Chat Service | conference |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
DELETE http://example.org:9090/plugins/restapi/v1/chatrooms/global/owners/testUser
DELETE<EMAIL_ADDRESS>DELETE http://example.org:9090/plugins/restapi/v1/chatrooms/global/admins/testUser
DELETE http://example.org:9090/plugins/restapi/v1/chatrooms/global/members/testUser
DELETE http://example.org:9090/plugins/restapi/v1/chatrooms/global/outcasts/testUser
DELETE http://example.org:9090/plugins/restapi/v1/chatrooms/global/owners/testUser?servicename=privateconf
Endpoint to get all system properties
GET /system/properties
Payload: none
Return value: System properties
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/system/properties
Endpoint to get information over specific system property
GET /system/properties/{propertyName}
Payload: none
Return value: System property
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| propertyName | @Path | The name of system property |
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/system/properties/xmpp.domain
Endpoint to create a system property
POST system/properties
Payload: System Property
Return value: HTTP status 201 (Created)
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type: application/xml
POST http://example.org:9090/plugins/restapi/v1/system/properties
Payload Example:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property key="propertyName" value="propertyValue"/>
Endpoint to delete a system property
DELETE /system/properties/{propertyName}
Payload: none
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| propertyName | @Path | The name of system property |
Header: Authorization: Basic YWRtaW46MTIzNDU=
DELETE http://example.org:9090/plugins/restapi/v1/system/properties/propertyName
Endpoint to update / overwrite a system property
PUT /system/properties/{propertyName}
Payload: System property
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| propertyName | @Path | The name of system property |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
PUT http://example.org:9090/plugins/restapi/v1/system/properties/propertyName
Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property key="propertyName" value="anotherValue"/>
Endpoint to get count of concurrent sessions
GET /system/statistics/sessions
Payload: none
Return value: Sessions count
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/system/statistics/sessions
Endpoint to get all groups
GET /groups
Payload: none
Return value: Groups
Header: Authorization: Basic YWRtaW46MTIzNDU=
Endpoint to get information over specific group
GET /groups/{groupName}
Payload: none
Return value: Group
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| groupName | @Path | The name of the group |
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/groups/moderators
Endpoint to create a new group
POST /groups
Payload: Group
Return value: HTTP status 201 (Created)
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type: application/xml
Payload Example:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<group>
<name>GroupName</name>
<description>Some description</description>
</group>
Endpoint to delete a group
DELETE /groups/{groupName}
Payload: none
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| groupName | @Path | The name of the group |
Header: Authorization: Basic YWRtaW46MTIzNDU=
DELETE http://example.org:9090/plugins/restapi/v1/groups/groupToDelete
Endpoint to update / overwrite a group
PUT /groups/{groupName}
Payload: Group
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| groupName | @Path | The name of the group |
Header: Authorization: Basic YWRtaW46MTIzNDU=
Header: Content-Type application/xml
PUT http://example.org:9090/plugins/restapi/v1/groups/groupNameToUpdate
Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<group>
<name>groupNameToUpdate</name>
<description>New description</description>
</group>
Endpoint to get all user sessions
GET /sessions
Payload: none
Return value: Sessions
Header: Authorization: Basic YWRtaW46MTIzNDU=
Endpoint to get sessions from a user
GET /sessions/{username}
Payload: none
Return value: Sessions
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | The username of the user |
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/sessions/testuser
Endpoint to close/kick sessions from a user
DELETE /sessions/{username}
Payload: none
Return value: HTTP status 200 (OK)
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @Path | The username of the user |
Header: Authorization: Basic YWRtaW46MTIzNDU=
DELETE http://example.org:9090/plugins/restapi/v1/sessions/testuser
Endpoint to send a broadcast/server message to all online users
POST /messages/users
Payload: Message
Return value: HTTP status 201 (Created)
Header: Authorization: Basic YWRtaW46MTIzNDU=
POST http://example.org:9090/plugins/restapi/v1/messages/users
Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message>
<body>Your message</body>
</message>
Endpoint to get security audit logs
GET /logs/security
Payload: none
Return value: Security Audit Logs
| Parameter | Parameter Type | Description | Default value |
|---|---|---|---|
| username | @QueryParam | Username of user to look up | |
| startTime | @QueryParam | Oldest timestamp of range of logs to retrieve | |
| endTime | @QueryParam | Most recent timestamp of range of logs to retrieve | 0 (until now) |
| offset | @QueryParam | Number of logs to skip | |
| limit | @QueryParam | Number of logs to retrieve |
Header: Authorization: Basic YWRtaW46MTIzNDU=
GET http://example.org:9090/plugins/restapi/v1/logs/security
Openfire REST API provides XML and JSON as data format. The default data format is XML.
To get a JSON result, please add “Accept: application/json” to the request header.
If you want to create a resource with JSON data format, please add “Content-Type: application/json”.
Since version RESP API 1.3.2 you can also use GZIP to compress the payload of the request or and the response.
“Content-Encoding: gzip” for the request. “Accept-Encoding: gzip” for the response.
| Parameter | Optional | Description |
|---|---|---|
| username | No | The username of the user |
| name | Yes | The name of the user |
| Yes | The email of the user | |
| password | No | The password of the user |
| properties | Yes | List of properties. Property is a key / value object. The key must to be per user unique |
| Parameter | Optional | Description |
|---|---|---|
| jid | No | The JID of the roster item |
| nickname | Yes | The nickname for the user when used in this roster |
| subscriptionType | Yes | The subscription type Possible numeric values are: -1 (remove), 0 (none), 1 (to), 2 (from), 3 (both) |
| groups | No | A list of groups to organize roster entries under (e.g. friends, co-workers, etc.) |
| Parameter | Optional | Description |
|---|---|---|
| roomName | No | The name/id of the room. Can only contains lowercase and alphanumeric characters. |
| naturalName | No | Also the name of the room, but can contains non alphanumeric characters. It’s mainly used for users while discovering rooms hosted by the Multi-User Chat service. |
| description | No | Description text of the room. |
| subject | Yes | Subject of the room. |
| password | Yes | The password that the user must provide to enter the room |
| creationDate | Yes | The date when the room was created. Will be automatically set by creation. Example: 2014-07-10T09:49:12.411+02:00 |
| modificationDate | Yes | The last date when the room’s configuration was modified. If the room’s configuration was never modified then the initial value will be the same as the creation date. Will be automatically set by update. Example: 2014-07-10T09:49:12.411+02:00 |
| maxUsers | Yes | the maximum number of occupants that can be simultaneously in the room. 0 means unlimited number of occupants. |
| persistent | Yes | Can be “true” or “false”. Persistent rooms are saved to the database to make their configurations persistent together with the affiliation of the users. Otherwise the room will be destroyed if the last occupant leave the room. |
| publicRoom | Yes | Can be “true” or “false”. True if the room is searchable and visible through service discovery. |
| registrationEnabled | Yes | Can be “true” or “false”. True if users are allowed to register with the room. By default, room registration is enabled. |
| canAnyoneDiscoverJID | Yes | Can be “true” or “false”. True if every presence packet will include the JID of every occupant. |
| canOccupantsChangeSubject | Yes | Can be “true” or “false”. True if participants are allowed to change the room’s subject. |
| canOccupantsInvite | Yes | Can be “true” or “false”. True if occupants can invite other users to the room. If the room does not require an invitation to enter (i.e. is not members-only) then any occupant can send invitations. On the other hand, if the room is members-only and occupants cannot send invitation then only the room owners and admins are allowed to send invitations. |
| canChangeNickname | Yes | Can be “true” or “false”. True if room occupants are allowed to change their nicknames in the room. By default, occupants are allowed to change their nicknames. |
| logEnabled | Yes | Can be “true” or “false”. True if the room’s conversation is being logged. If logging is activated the room conversation will be saved to the database every couple of minutes. The saving frequency is the same for all the rooms and can be configured by changing the property “xmpp.muc.tasks.log.timeout”. |
| loginRestrictedToNickname | Yes | Can be “true” or “false”. True if registered users can only join the room using their registered nickname. By default, registered users can join the room using any nickname. |
| membersOnly | Yes | Can be “true” or “false”. True if the room requires an invitation to enter. That is if the room is members-only. |
| moderated | Yes | Can be “true” or “false”. True if the room in which only those with “voice” may send messages to all occupants. |
| broadcastPresenceRoles | Yes | The list of roles of which presence will be broadcasted to the rest of the occupants. |
| owners | Yes | A collection with the current list of owners. The collection contains the bareJID of the users with owner affiliation. |
| admins | Yes | A collection with the current list of admins. The collection contains the bareJID of the users with admin affiliation. |
| members | Yes | A collection with the current list of room members. The collection contains the bareJID of the users with member affiliation. If the room is not members-only then the list will contain the users that registered with the room and therefore they may have reserved a nickname. |
| outcasts | Yes | A collection with the current list of outcast users. An outcast user is not allowed to join the room again. The collection contains the bareJID of the users with outcast affiliation. |
| ownerGroups | Yes | A collection with the current list of groups with owner affiliation. The collection contains the name only. |
| adminGroups | Yes | A collection with the current list of groups with admin affiliation. The collection contains the name only. |
| memberGroups | Yes | A collection with the current list of groups with member affiliation. The collection contains the name only. |
| outcastGroups | Yes | A collection with the current list of groups with outcast affiliation. The collection contains the name only. |
| Parameter | Optional | Description |
|---|---|---|
| name | No | The name of the group |
| description | No | The description of the group |
| admins | Yes | A collection with current admins of the group |
| members | Yes | A collection with current members of the group |
| Parameter | Optional | Description |
|---|---|---|
| key | No | The name of the system property |
| value | No | The value of the system property |
| Parameter | Optional | Description |
|---|---|---|
| sessionId | No | Full JID of a user e.g<EMAIL_ADDRESS>|
| username | No | The username associated with this session. Can be also “Anonymous”. |
| ressource | Yes | Ressource name |
| node | No | Can be “Local” or “Remote” |
| sessionStatus | No | The current status of this session. Can be “Closed”, “Connected”, “Authenticated” or “Unknown”. |
| presenceStatus | No | The status of this presence packet, a natural-language description of availability status. |
| priority | No | The priority of the session. The valid priority range is -128 through 128. |
| hostAddress | No | Tthe IP address string in textual presentation. |
| hostName | No | The host name for this IP address. |
| creationDate | No | The date the session was created. |
| lastActionDate | No | The time the session last had activity. |
| secure | No | Is “true” if this connection is secure. |
| Parameter | Optional | Description |
|---|---|---|
| clusterSessions | No | Number of client sessions that are authenticated with the server. This includes anonymous and non-anoymous users from the whole cluster. |
| localSessions | No | Number of client sessions that are authenticated with the server. This includes anonymous and non-anoymous users. |
| Parameter | Optional | Description |
|---|---|---|
| logId | No | unique ID of this log |
| username | No | the username of the user who performed this event |
| timestamp | No | the time stamp of when this event occurred |
| summary | No | the summary, or short description of what transpired in the event |
| node | No | the node that triggered the event, usually a hostname or IP address |
| details | No | detailed information about what occurred in the event |
The User Service Plugin provides the ability to add,edit,delete users and manage their rosters by sending an http request to the server. It is intended to be used by applications automating the user administration process. This plugin’s functionality is useful for applications that need to administer users outside of the Openfire admin console. An example of such an application might be a live sports reporting application that uses XMPP as its transport, and creates/deletes users according to the receipt, or non receipt, of a subscription fee.
Copy userservice.jar into the plugins directory of your Openfire server. The plugin will then be automatically deployed. To upgrade to a new version, copy the new userservice.jar file over the existing file.
Access to the service is restricted with a “secret” that can be viewed and set from the User Service page in the Openfire admin console. This page is located on the admin console under “Server” and then “Server Settings”. This should really only be considered weak security. The plugin was initially written with the assumption that http access to the Openfire service was only available to trusted machines. In the case of the plugin’s author, a web application running on the same server as Openfire makes the request.
To administer users, submit HTTP requests to the userservice service. The service address is [hostname]plugins/restapi/userservice. For example, if your server name is “example.com”, the URL is http://example.com/plugins/restapi/userservice
The following parameters can be passed into the request:
| Name | Description | |
|---|---|---|
| type | Required | The admin service required. Possible values are ‘add’, ‘delete’, ‘update’, ‘enable’, ‘disable’, ‘add_roster’, ‘update_roster’, ‘delete_roster’, ‘grouplist’, ‘usergrouplist’. |
| secret | Required | The secret key that allows access to the User Service. |
| username | Required | The username of the user to ‘add’, ‘delete’, ‘update’, ‘enable’, ‘disable’, ‘add_roster’, ‘update_roster’, ‘delete_roster’. ie the part before the @ symbol. |
| password | Required for ‘add’ operation | The password of the new user or the user being updated. |
| name | Optional | The display name of the new user or the user being updated. For ‘add_roster’, ‘update_roster’ operations specifies the nickname of the roster item. |
| Optional | The email address of the new user or the user being updated. | |
| groups | Optional | List of groups where the user is a member. Values are comma delimited. When used with types “add” or “update”, it adds the user to shared groups and auto-creates new groups. When used with ‘add_roster’ and ‘update_roster’, it adds the user to roster groups provided the group name does not clash with an existing shared group. |
| item_jid | Required for ‘add_roster’, ‘update_roster’, ‘delete_roster’ operations. | The JID of the roster item |
| subscription | Optional | Type of subscription for ‘add_roster’, ‘update_roster’ operations. Possible numeric values are: -1(remove), 0(none), 1(to), 2(from), 3(both). |
The following example adds a user
The following example adds a user, adds two shared groups (if not existing) and adds the user to both groups.
The following example deletes a user and all roster items of the user.
http://example.com:9090/plugins/restapi/userservice?type=delete&secret=bigsecret&username=kafka
The following example disables a user (lockout)
http://example.com:9090/plugins/restapi/userservice?type=disable&secret=bigsecret&username=kafka
The following example enables a user (removes lockout)
http://example.com:9090/plugins/restapi/userservice?type=enable&secret=bigsecret&username=kafka
The following example updates a user
The following example adds new roster item with subscription ‘both’ for user ‘kafka’
The following example adds new roster item with subscription ‘both’ for user ‘kafka’ and adds kafka to roster groups ‘family’ and ‘friends’
The following example updates existing roster item to subscription ‘none’ for user ‘kafka’
The following example deletes a specific roster item<EMAIL_ADDRESS>for user ‘kafka’
The following example gets all groups
http://example.com:9090/plugins/restapi/userservice?type=grouplist&secret=bigsecret
Which replies an XML group list formatted like this:
<result>
<groupname>group1</groupname>
<groupname>group2</groupname>
</result>
The following example gets all groups for a specific user
http://example.com:9090/plugins/restapi/userservice?type=usergrouplist&secret=bigsecret&username=kafka
Which replies an XML group list formatted like this:
<result>
<groupname>usergroup1</groupname>
<groupname>usergroup2</groupname>
</result>
* When sending double characters (Chinese/Japanese/Korean etc) you should URLEncode the string as utf8.
In Java this is done like this
URLEncoder.encode(username, “UTF-8”));
If the strings are encoded incorrectly, double byte characters will look garbeled in the Admin Console.
The server will reply to all User Service requests with an XML result page. If the request was processed successfully the return will be a “result” element with a text body of “OK”, or an XML grouplist formatted like in the example for “grouplist” and “usergrouplist” above. If the request was unsuccessful, the return will be an “error” element with a text body of one of the following error strings.
| Error String | Description |
|---|---|
| IllegalArgumentException | One of the parameters passed in to the User Service was bad. |
| UserNotFoundException | No user of the name specified, for a delete or update operation, exists on this server. For ‘update_roster’ operation, roster item to be updated was not found. |
| UserAlreadyExistsException | A user with the same name as the user about to be added, already exists. For ‘add_roster’ operation, roster item with the same JID already exists. |
| RequestNotAuthorised | The supplied secret does not match the secret specified in the Admin Console or the requester is not a valid IP address. |
| UserServiceDisabled | The User Service is currently set to disabled in the Admin Console. |
| SharedGroupException | Roster item can not be added/deleted to/from a shared group for operations with roster. |


Overtime Calculator
Hours Input
Current Week Total
Hours Worked Today
Use for TimeSheet
Please use the values below and appropriate codes to log your time into your timesheet.
Regular Hours:
OT Hours:
Week Total:


Hello, world!
it's an exciting period of creating my portfolio page!
Here are some Interesting things to learn about coding
coding is indeed a great and fun experience you can indicate different styles.And you can create different web-pages in your device


closed
by Kevin Reiss at 2023-02-20 17:03:18.closed
by Kevin Reiss at 2023-02-20 17:03:20.closed
by Kevin Reiss at 2023-02-20 17:03:19.referenced
by Jane Sandberg at 2023-02-20 17:47:18.merged
by Jane Sandberg at 2023-02-20 17:47:18.closed
by Jane Sandberg at 2023-02-20 17:47:18.head_ref_deleted
by Jane Sandberg at 2023-02-20 17:47:19.close as duplicate of #47
closed
by None at 2023-02-20 18:04:39.referenced
by Trey Pendragon at 2023-02-20 18:39:07.merged
by Trey Pendragon at 2023-02-20 18:39:07.closed
by Trey Pendragon at 2023-02-20 18:39:07.head_ref_deleted
by Trey Pendragon at 2023-02-20 18:39:08.referenced
by None at 2023-02-20 18:06:24.assigned
by None at 2023-02-20 18:10:09.closed
by Trey Pendragon at 2023-02-20 18:39:08.referenced
by Trey Pendragon at 2023-02-20 18:39:25.merged
by Trey Pendragon at 2023-02-20 18:39:25.closed
by Trey Pendragon at 2023-02-20 18:39:25.head_ref_deleted
by Trey Pendragon at 2023-02-20 18:39:26.assigned
by None at 2023-02-20 18:09:52.referenced
by None at 2023-02-20 18:12:30.closed
by Trey Pendragon at 2023-02-20 18:39:26.referenced
by Trey Pendragon at 2023-02-20 18:39:43.merged
by Trey Pendragon at 2023-02-20 18:39:43.closed
by Trey Pendragon at 2023-02-20 18:39:43.head_ref_deleted
by Trey Pendragon at 2023-02-20 18:39:44.assigned
by None at 2023-02-20 18:01:34.referenced
by None at 2023-02-20 18:03:39.closed
by Trey Pendragon at 2023-02-20 18:39:44.labeled
by None at 2023-02-20 16:31:19.labeled
by None at 2023-02-20 16:32:03.labeled
by None at 2023-02-20 16:39:09.labeled
by None at 2023-02-20 16:45:22.labeled
by None at 2023-02-20 16:45:01.unlabeled
by Shaun Ellis at 2023-02-20 20:27:33.unlabeled
by None at 2023-02-20 20:29:09.unlabeled
by None at 2023-02-20 20:29:09.labeled
by None at 2023-02-20 16:44:49.unlabeled
by Shaun Ellis at 2023-02-20 20:33:16.unlabeled
by Shaun Ellis at 2023-02-20 20:33:16.Possible fix: We could remove collections from children for the Lapidus collection. Parents are not in collections and are not getting indexed. Parents should be assigned to the Sid Lapidus '59 Collection.
Example: https://figgy.princeton.edu/catalog/289a9501-f031-41ba-84b2-b9121fde5c13 Parent: https://figgy.princeton.edu/catalog/1000ce02-8e21-4527-8ebc-128ea673822d
labeled
by None at 2023-02-20 20:52:50.unlabeled
by None at 2023-02-20 20:53:02.Ok, folks! Everything is moved into one collection, so only one report is needed. Please run a report for:
labeled
by Trey Pendragon at 2023-02-20 20:07:18.labeled
by Trey Pendragon at 2023-02-20 20:16:29.We've determined the boxes are from the private use area of that particular font, which we won't support. Closing this as wontfix, if they need a new font just to improve the non-PUA parts, then we'll look into that later.
closed
by Trey Pendragon at 2023-02-20 20:34:41.labeled
by Trey Pendragon at 2023-02-20 20:34:47.unlabeled
by Shaun Ellis at 2023-02-20 20:35:17.unlabeled
by Shaun Ellis at 2023-02-20 20:35:17.labeled
by Shaun Ellis at 2023-02-20 20:35:52.labeled
by Trey Pendragon at 2023-02-20 20:25:05.unlabeled
by Shaun Ellis at 2023-02-20 20:51:07.renamed
by Kim Leaman at 2023-02-20 21:00:39.Changed the date property type to ::Types::Params::DateTime
as @hackartisan suggested, and for properly formatted dates, the validation works as expected. However, for an invalid date string like "Today", I am getting Dry::Types::CoercionError: invalid date
thrown from ./app/changesets/changeset.rb before my validation error message gets to show.
Any suggestions for how to handle this error/where to rescue it?
@taylor-yamashita it looks like they've accounted for this issue in reform... I'm not sure exactly how it all hooks up. Maybe it's this coercion require? https://trailblazer.to/2.1/docs/reform.html#reform-options-coercion
head_ref_force_pushed
by Taylor Yamashita at 2023-02-20 19:17:08.mentioned
by None at 2023-02-20 20:07:43.subscribed
by None at 2023-02-20 20:07:43.mentioned
by Taylor Yamashita at 2023-02-20 22:21:08.subscribed
by Taylor Yamashita at 2023-02-20 22:21:08.closed
by Robert-Anthony Lee-Faison at 2023-02-20 14:07:55.assigned
by Robert-Anthony Lee-Faison at 2023-02-20 18:05:39.probably a reindex
Store size in database as 2 (foot), but display as "25 x 12"
head_ref_force_pushed
by Jane Sandberg at 2023-02-20 18:31:30.referenced
by Max Kadel at 2023-02-20 20:49:28.merged
by Max Kadel at 2023-02-20 20:49:28.closed
by Max Kadel at 2023-02-20 20:49:28.head_ref_deleted
by Max Kadel at 2023-02-20 20:49:29.assigned
by Jane Sandberg at 2023-02-20 17:09:06.closed
by Max Kadel at 2023-02-20 20:49:30.review_requested
by Max Kadel at 2023-02-20 17:47:47.deployed
by None at 2023-02-20 21:48:21.referenced
by Jane Sandberg at 2023-02-20 21:56:22.merged
by Jane Sandberg at 2023-02-20 21:56:22.closed
by Jane Sandberg at 2023-02-20 21:56:22.head_ref_deleted
by Jane Sandberg at 2023-02-20 21:56:23.closed
by Jane Sandberg at 2023-02-20 21:56:24.head_ref_force_pushed
by Jane Sandberg at 2023-02-20 22:07:37.review_requested
by Jane Sandberg at 2023-02-20 22:16:46.deployed
by None at 2023-02-20 16:08:24.referenced
by Max Kadel at 2023-02-20 17:47:05.merged
by Max Kadel at 2023-02-20 17:47:05.closed
by Max Kadel at 2023-02-20 17:47:05.head_ref_deleted
by Max Kadel at 2023-02-20 17:47:09.assigned
by Jane Sandberg at 2023-02-20 18:44:46.assigned
by None at 2023-02-20 18:28:58.deployed
by None at 2023-02-20 19:33:48.referenced
by James R. Griffin III at 2023-02-20 19:59:53.merged
by James R. Griffin III at 2023-02-20 19:59:53.closed
by James R. Griffin III at 2023-02-20 19:59:53.head_ref_deleted
by James R. Griffin III at 2023-02-20 19:59:54.The issue in this particular case was quite surprising: We are sending the user to<EMAIL_ADDRESS>but Rails is interpreting the ".com" as a file extension and splitting the value in the URL into id=somebody@gmail
and format=com
and that's what's causing the look up by email "somebody@gmail" to fail.
I did a quick fix in PR #995 to handle this.
@escowles you were right, that was the issue.
assigned
by Hector Correa at 2023-02-20 17:15:18.labeled
by Bess Sadler at 2023-02-20 17:16:24.closed
by James R. Griffin III at 2023-02-20 19:59:55.mentioned
by Esmé Cowles at 2023-02-20 20:54:56.subscribed
by Esmé Cowles at 2023-02-20 20:54:56.assigned
by Hector Correa at 2023-02-20 22:53:55.renamed
by Hector Correa at 2023-02-20 22:54:11.referenced
by None at 2023-02-20 23:09:49.merged
by None at 2023-02-20 23:09:49.closed
by None at 2023-02-20 23:09:49.head_ref_deleted
by None at 2023-02-20 23:09:50.@kevinreiss will make tickets to create cap task for the individual drupal & PAS sites
mentioned
by Kevin Reiss at 2023-02-20 16:37:26.subscribed
by Kevin Reiss at 2023-02-20 16:37:26.assigned
by Kevin Reiss at 2023-02-20 16:38:37.The query here is coming from our library all-search page rather than a crawler or bot.
There is an issue in the blacklightadvancedsearch repo about this from 2019: https://github.com/projectblacklight/blacklight_advanced_search/issues/101
And an un-reveiwed/un-merged PR from 2020: https://github.com/projectblacklight/blacklight_advanced_search/pull/122
I suggest we close this until it becomes a problem.
labeled
by Eliot Jordan at 2023-02-20 18:19:48.labeled
by Eliot Jordan at 2023-02-20 18:19:48.renamed
by None at 2023-02-20 18:20:46.assigned
by Chuck McCallum at 2023-02-20 13:15:00.renamed
by Chuck McCallum at 2023-02-20 15:05:40.While attempting to install MediaFlux within the Docker Container, I find the following:
root@6e68f03a5222:/setup# ./mf_setup
########################################################
Mediaflux System Installer
########################################################
Installing from "/dist" to "/usr/local"
Install scripts root "/setup/scripts"
Using Mediaflux JSON configuration files in "/setup/config"
Checking License File "/setup/licenses/licence.xml"
System UUID: 4892
System MAC: 02:42:ac:11:00:02
License Expiration: 19-Mar-2023
Proceed (Y or N)? [N] Y
========================================================
Generating configuration scripts...
 Install directory "/usr/local/mediaflux_4_14_014" exists ... bailing
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Mediaflux setup failed.
Have a most excellent day.
This seems to boot the service:
root@e6912fa2a153:/setup# /usr/bin/env java -jar /usr/local/mediaflux/bin/aserver.jar application.home=/usr/local/mediaflux nogui
...as the HTTP interface will then be bound and available to localhost:8888
:
root@e6912fa2a153:/setup# curl -I localhost:8888/
HTTP/1.1 200 OK
Connection: Close
Cache-Control: private
Server: Mediaflux
Date: Mon, 20 Feb 2023 14:37:34 +0000
Last-Modified: Thu, 22 Dec 2022 18:41:00 +0000
Content-Length: 523
Content-Type: text/html
x-arc-content-csum: 5481338E
User credentials are found within the following file:
root@e6912fa2a153:/setup/config# head users.json
{
":" :[
{
"first": "Craig",
"last": "Vanderborgh",
"password": $SECRET,
"email"<EMAIL_ADDRESS>},
{
"first": "Todd",
The following is necessary to authenticate using mfcommand
:
root@e6912fa2a153:~# cd /setup/scripts/convenience/
root@e6912fa2a153:/setup/scripts/convenience# bash ./mfcommand logon system manager change_me
The previous step was necessary in order to ensure that I could then invoke commands:
root@e6912fa2a153:/setup/scripts/convenience# bash ./mfcommand user.list :domain system
:user -id "43" -domain "system" -internal "false" -aid "988" "Craig.Vanderborgh"
:user -id "44" -domain "system" -internal "false" -aid "989" "Todd.Weybrew"
:user -id "15" -domain "system" -internal "false" -aid "0" "manager"
:user -id "19" -domain "system" -internal "true" -aid "0" "replicator"
:user -id "18" -domain "system" -internal "false" -aid "0" "service"
:complete "true"
Invoking the following for docker
(this should probably be restructured for docker-compose
), I was able to successfully authenticate using localhost
:
docker run \
--interactive \
--rm \
--tty \
--privileged \
--init \
--name mediaflux \
--publish <IP_ADDRESS>:8888:8888 \
regdev.rc.princeton.edu/developer-image:latest \
/bin/bash
...then, from within the environment of the Docker container using the terminal session created by the previous invocation:
root@c981fcd1859c:/setup# /usr/bin/env java -jar /usr/local/mediaflux/bin/aserver.jar application.home=/usr/local/mediaflux nogui
I was then able to access this using a web browser for localhost
:
Please note that I am still struggling to determine how one can authenticate using personal user accounts (e. g<EMAIL_ADDRESS>). Currently I am still relying upon the manager
user account within the system
domain.
I have found the solution for this now as well, this became clear within the aterm
:
> authentication.domain.list
:domain -type "local" "mflux"
:domain -type "local" "princeton.edu"
:domain -type "local" -description "Default bootstrap domain" "system"
:domain -type "local" "www-public"
> user.list :domain princeton.edu
:user -id "51" -domain "princeton.edu" -internal "false" -aid "995" "Bess.Sadler"
:user -id "49" -domain "princeton.edu" -internal "false" -aid "993" "Carolyn.Cole"
:user -id "53" -domain "princeton.edu" -internal "false" -aid "997" "Chuck.McCallum"
:user -id "52" -domain "princeton.edu" -internal "false" -aid "996" "Hector.Correa"
:user -id "50" -domain "princeton.edu" -internal "false" -aid "994" "James.Griffin"
:user -id "46" -domain "princeton.edu" -internal "false" -aid "990" "John.Wiggins"
:user -id "48" -domain "princeton.edu" -internal "false" -aid "992" "Kate.Lynch"
:user -id "47" -domain "princeton.edu" -internal "false" -aid "991" "Rishi.Joshi"
:complete "true"
Using the domain princeton.edu
and user names which are human-readable (e. g. James.Griffin
), one can then authenticate. I relied upon retrieving the passwords using a second terminal session and reading the content of the file /setup/config/users.json
.
This ticket does not refer to identity management. The meeting with Keith is not a blocker. This ticket refers to setting up the Rails application to specifically point to the staging server that Robert and Rishi set up as part of the application configuration.
If you need further direction or clarification, please reach out to me.
reopening: Wait until other users can confirm that it works locally.
reopened
by Chuck McCallum at 2023-02-20 17:16:46.Made a fresh clean branch, but hit the same error.
closed
by Chuck McCallum at 2023-02-20 21:03:08.head_ref_deleted
by Chuck McCallum at 2023-02-20 21:03:12.Glanced at SO, but no obvious answer.
Between pdc_describe
and this repo, there are a few differences, but none of these seem like an obvious problem.
- devise has moved from 4.8.1 to 4.9.0
- In from_cas
missing if user.nil?
... but I don't think we're even reaching that point.
- devise.rb
for pdc_describe is missing config.responder.error_status
and config.responder.redirect_status
but otherwise no significant difference.
Next: look at the devise release notes between 4.8.1 and 4.9.0
There have been some changes, but it seems to be in what the button does, and I don't think that's our problem. The partial where the error arises hasn't changed between versions:
diff ~/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/devise-4.9.0/app/views/devise/sessions/new.html.erb \
~/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/devise-4.8.1/app/views/devise/sessions/new.html.erb
But it seems odd that we're even hitting this form -- This is a login form, and it shouldn't be our code or our dependency that is generating the form, I don't think.


Instructions: Focus in the input below, either type f or b or press the down arrow. Select a choice from the list and press Enter to accept it. Keyboard events that occured on the datalist should NOT fire on the input.


300 extra beds to be made available for homeless people over the winter
by By Fiachra Ó CionnaithAt least 300 more beds for homeless people will be made available in a bid to ensure rough sleepers and other vulnerable people are not left out on the streets during the winter freeze.
Government ministers confirmed the plan as part of the cross-departmental Be Winter Ready campaign amid ongoing criticism it is failing to help people in most need.
In a campaign launch on Wednesday morning, Housing Minister Eoghan Murphy, Transport Minister Shane Ross, junior minister for local government Damien English and Business Minister Heather Humphreys said supports will be provided.
Highlighting planned help for homeless people, companies and commuters, they said the Government will put in place a number of new measures between now and spring to plug widespread gaps in the existing system.
Under the Government plans:
- 300 more beds will be made available for homeless people in Ireland
- 217,000 tonnes of salt will be provided to address the protect the country's roads in freezing and winter storm conditions
- Businesses will be given extra advice to help them cope with the worst weather conditions over the coming months
The plans are likely to be welcomed by a number of groups that could be affected by any poor winter weather.
However, it remains unclear if the extra 300 beds for homeless people and other matters will go far enough to adequately address the deepening homeless crisis, which has resulted in more than 10,000 people now officially facing that situation.
Meanwhile, the Irish Nurses and Midwives Organisation has raised separate concerns over the Government's winter ready plan, saying it does not include any details on how ministers intend to tackle hospital overcrowding.
Speaking after the Government campaign's launch, INMO general secretary Phil Ní Sheaghdha said the fact 679 people were on hospital trolleys on Tuesday and another 649 on Wednesday is "obscene", saying: "Winter has not even started and Irish hospitals are overwhelmed."
The HSE winter plan, which is likely to address some of these issues, is expected to be published next week.
READ MORE
Legislation could see schools publishing voluntary contribution figures


{% extends 'dockerfile/_dockerfile.html' %} {% load staticfiles %}{% load google_analytics %}{% load navactive %} {% block page_js %} {{ block.super }} {% endblock page_js %} {% block content %}
In this section we will cover the most important instructions: FROM
and RUN
.
We will also see how to use the docker build
command and how to specify the maintainer of the Dockerfile and how to insert comments.
All Dockerfile instructions look like this:
INSTRUCTION arguments
Instructions are not case sensitive, but we recommend to use capital letters.
The first instruction of every Dockerfile needs to be the FROM
instruction
FROM image
It sets the base image for subsequent instructions.
Example:
FROM ubuntu
In this example, we chose ubuntu as our base image. ubuntu is a “General use Ubuntu base image” provided by the Docker team.
You can find a list of available images from the command line by using the docker search command.
Example:
root@precise64:/home/vagrant/dockerfiles# docker search centos
Found 14 results matching your query ("centos")
NAME DESCRIPTION
centos
backjlack/centos-6.4-x86_64
creack/centos
mbkan/lamp centos with ssh, LAMP, PHPMyAdmin(root password 'toor' and MySQL root password 'sysadmin'). Auto starts sshd, MySQL and Apache. Just launch us...
zenosslabs/centos
slantview/centos-chef-solo CentOS 6.4 with chef-solo.
tchap/centos-epel The official centos image having EPEL added among its repositories.
backjlack/centos This repository contains the following images: Centos 5.9 (more to be added soon)
oss17888/centos6.4
markl/centos
troygoode/centos-node-hello
austin/centos-base
estrai/centos32 Centos 5.9 32-bit based on an OpenVZ image.
comodit/centos
So let’s say you want to use centos as you base image, you can for instance use the following line:
FROM centos
You can also browse available images from Docker and the community online: index.docker.io
The RUN
instruction will execute any commands on the current image and commit the results. The resulting committed image will be used for the next step in the Dockerfile.
Layering RUN instructions and generating commits conforms to the core concepts of Docker where commits are cheap and containers can be created from any point in an image’s history, much like source control.
RUN command
RUN command
is equivalent to the docker commands: docker run image command
+ docker commit container_id
,
Where image would be replaced automatically with the current image, and container_id would be the result of the previous RUN
instruction.
Example:
RUN apt-get install -y memcachedAs we saw earlier, we need to have the
FROM
instruction before any RUN
instruction, so that docker knows from which base image to start running the instruction on. For instance:
FROM ubuntu RUN apt-get install -y memcached
This example creates an image with memcached installed on the ubuntu image. It is the equivalent to the following command lines:
root@precise64:/home/vagrant/dockerfiles# docker run ubuntu apt-get install -y memcached […] [=> container id is 9fb69e798e67] root@precise64:/home/vagrant/dockerfiles# docker commit 9fb69e798e67 6742949a1bae
Once you have your Dockerfile ready, you can use the docker build command to create your image from it. There are different ways to use this command:
docker build .
docker build - < Dockerfile
docker build github.com/creack/docker-firefox
Let’s run our last Dockerfile example.
root@precise64:/home/vagrant/dockerfiles# cat Dockerfile FROM ubuntu RUN apt-get install -y memcached root@precise64:/home/vagrant/dockerfiles# docker build . Uploading context 20480 bytes Step 1 : FROM ubuntu Pulling repository ubuntu Pulling image 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c (precise) from ubuntu Pulling image b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc (quantal) from ubuntu Pulling b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc metadata Pulling b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc fs layer Downloading 10.24 kB/10.24 kB (100%) Pulling 27cf784147099545 metadata Pulling 27cf784147099545 fs layer Downloading 10.24 kB/10.24 kB (100%) Pulling 27cf784147099545 metadata Pulling 27cf784147099545 fs layer Downloading 94.86 MB/94.86 MB (100%) ---> 8dbd9e392a96 Step 2 : RUN apt-get install -y memcached ---> Running in dedc7af62d9f Reading package lists... Building dependency tree... The following extra packages will be installed: libclass-isa-perl libevent-2.0-5 libgdbm3 libswitch-perl netbase perl perl-modules Suggested packages: libcache-memcached-perl libmemcached perl-doc libterm-readline-gnu-perl libterm-readline-perl-perl make libpod-plainer-perl The following NEW packages will be installed: libclass-isa-perl libevent-2.0-5 libgdbm3 libswitch-perl memcached netbase perl perl-modules 0 upgraded, 8 newly installed, 0 to remove and 0 not upgraded. Need to get 8070 kB of archives. After this operation, 32.8 MB of additional disk space will be used. Get:1 http://archive.ubuntu.com/ubuntu/ precise/main libgdbm3 amd64 1.8.3-10 [35.3 kB] Get:2 http://archive.ubuntu.com/ubuntu/ precise/main netbase all 4.47ubuntu1 [15.0 kB] Get:3 http://archive.ubuntu.com/ubuntu/ precise/main libclass-isa-perl all 0.36-3 [11.9 kB] Get:4 http://archive.ubuntu.com/ubuntu/ precise/main libevent-2.0-5 amd64 2.0.16-stable-1 [127 kB] Get:5 http://archive.ubuntu.com/ubuntu/ precise/main perl-modules all 5.14.2-6ubuntu2 [3369 kB] Get:6 http://archive.ubuntu.com/ubuntu/ precise/main perl amd64 5.14.2-6ubuntu2 [4417 kB] Get:7 http://archive.ubuntu.com/ubuntu/ precise/main libswitch-perl all 2.16-2 [19.2 kB] Get:8 http://archive.ubuntu.com/ubuntu/ precise/main memcached amd64 1.4.13-0ubuntu2 [75.3 kB] debconf: delaying package configuration, since apt-utils is not installed Fetched 8070 kB in 7s (1136 kB/s) Selecting previously unselected package libgdbm3. (Reading database ... 7545 files and directories currently installed.) Unpacking libgdbm3 (from .../libgdbm3_1.8.3-10_amd64.deb) ... Selecting previously unselected package netbase. Unpacking netbase (from .../netbase_4.47ubuntu1_all.deb) ... Selecting previously unselected package libclass-isa-perl. Unpacking libclass-isa-perl (from .../libclass-isa-perl_0.36-3_all.deb) ... Selecting previously unselected package libevent-2.0-5. Unpacking libevent-2.0-5 (from .../libevent-2.0-5_2.0.16-stable-1_amd64.deb) ... Selecting previously unselected package perl-modules. Unpacking perl-modules (from .../perl-modules_5.14.2-6ubuntu2_all.deb) ... Selecting previously unselected package perl. Unpacking perl (from .../perl_5.14.2-6ubuntu2_amd64.deb) ... Selecting previously unselected package libswitch-perl. Unpacking libswitch-perl (from .../libswitch-perl_2.16-2_all.deb) ... Selecting previously unselected package memcached. Unpacking memcached (from .../memcached_1.4.13-0ubuntu2_amd64.deb) ... Setting up libgdbm3 (1.8.3-10) ... Setting up netbase (4.47ubuntu1) ... Setting up libclass-isa-perl (0.36-3) ... Setting up libevent-2.0-5 (2.0.16-stable-1) ... Setting up perl-modules (5.14.2-6ubuntu2) ... Setting up perl (5.14.2-6ubuntu2) ... update-alternatives: using /usr/bin/prename to provide /usr/bin/rename (rename) in auto mode. Setting up memcached (1.4.13-0ubuntu2) ... Starting memcached: memcached. Setting up libswitch-perl (2.16-2) ... Processing triggers for libc-bin ... ldconfig deferred processing now taking place ---> 1dcfa24c8ca6 Successfully built 1dcfa24c8ca6
You can see your newly created image 1dcfa24c8ca6
in the ouput of docker images
:
root@precise64:/home/vagrant/dockerfiles# docker images
REPOSITORY TAG ID CREATED SIZE
ubuntu 12.04 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB)
ubuntu 12.10 b750fe79269d 4 months ago 24.65 kB (virtual 180.1 MB)
ubuntu latest 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB)
ubuntu precise 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB)
ubuntu quantal b750fe79269d 4 months ago 24.65 kB (virtual 180.1 MB)
<none> <none> 1275893fed44 9 minutes ago 12.3 kB (virtual 566.4 MB)
<none> <none> 1dcfa24c8ca6 About a minute ago 52.27 MB (virtual 183.8 MB)
Note that it does not have a name yet. Let’s name it with the command docker tag
.
root@precise64:/home/vagrant/dockerfiles# docker tag 1dcfa24c8ca6 memcached root@precise64:/home/vagrant/dockerfiles# docker images REPOSITORY TAG ID CREATED SIZE ubuntu 12.04 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB) ubuntu 12.10 b750fe79269d 4 months ago 24.65 kB (virtual 180.1 MB) ubuntu latest 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB) ubuntu precise 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB) ubuntu quantal b750fe79269d 4 months ago 24.65 kB (virtual 180.1 MB) memcached latest 1dcfa24c8ca6 4 minutes ago 52.27 MB (virtual 183.8 MB) <none> <none> 1275893fed44 12 minutes ago 12.3 kB (virtual 566.4 MB)
The good news is that docker build
comes with the option -t
with which you can directly tag the (last) image created with the Dockerfile. So we could have used docker build -t memcached .
directly.
root@precise64:/home/vagrant/dockerfiles# docker build -t memcached_new . Uploading context 20480 bytes Step 1 : FROM ubuntu […] Step 2 : RUN apt-get install -y memcached […] Successfully built 1dcfa24c8ca6 root@precise64:/home/vagrant/dockerfiles# docker images REPOSITORY TAG ID CREATED SIZE ubuntu 12.04 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB) ubuntu 12.10 b750fe79269d 4 months ago 24.65 kB (virtual 180.1 MB) ubuntu latest 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB) ubuntu precise 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB) ubuntu quantal b750fe79269d 4 months ago 24.65 kB (virtual 180.1 MB) memcached_new latest 1dcfa24c8ca6 4 minutes ago 52.27 MB (virtual 183.8 MB) <none> <none> 1275893fed44 4 minutes ago 12.3 kB (virtual 566.4 MB)
We have written almost all of it in the previous sections.
FROM ubuntu RUN apt-get install -y memcached
But we want to ensure that the ubuntu package repository is up to date. With the command line we would do:
root@precise64:/home/vagrant/dockerfiles# echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list root@precise64:/home/vagrant/dockerfiles# apt-get update
Within the Dockerfile, we will use the RUN
instruction.
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update
So our final Dockerfile looks like this:
FROM ubuntu RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get install -y memcached
Note that this Dockerfile would be equivalent to the following command lines:
root@precise64:/home/vagrant/dockerfiles# docker run ubuntu echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list […] [=> container id is 72d2a39bc64d] root@precise64:/home/vagrant/dockerfiles# docker commit 72d2a39bc64d d7a97544c0c7 root@precise64:/home/vagrant/dockerfiles# docker run d7a97544c0c7 apt-get update […] [=> container id is 66b22a0ef7c9] root@precise64:/home/vagrant/dockerfiles# docker commit 66b22a0ef7c9 a5f142a604b3 root@precise64:/home/vagrant/dockerfiles# docker run a5f142a604b3 apt-get install -y memcached […] [=> container id is 9fb69e798e67] root@precise64:/home/vagrant/dockerfiles# docker commit 9fb69e798e67 6742949a1bae
Let’s create our image. We will use the -t
option with docker build
in order to give a name to our image.
root@precise64:/home/vagrant/dockerfiles# cat Dockerfile FROM ubuntu RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get install -y memcached root@precise64:/home/vagrant/dockerfiles# docker build -t brand_new_memcached - < Dockerfile Uploading context 2048 bytes Step 1 : FROM ubuntu ---> 8dbd9e392a96 Step 2 : RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list ---> Using cache ---> 913c2344b312 Step 3 : RUN apt-get update ---> Using cache ---> 0a77b6e48393 Step 4 : RUN apt-get install -y memcached ---> Running in d1eadc19edc6 Reading package lists... Building dependency tree... The following extra packages will be installed: libclass-isa-perl libevent-2.0-5 libgdbm3 libswitch-perl netbase perl perl-modules […] Starting memcached: memcached. Setting up libswitch-perl (2.16-2) ... Processing triggers for libc-bin ... ldconfig deferred processing now taking place ---> 782a37534312 Successfully built 782a37534312
The id of the image is 782a37534312 but it already has a name as we can verify with docker images:
root@precise64:/home/vagrant/dockerfiles# docker images
REPOSITORY TAG ID CREATED SIZE
memcached_new latest 1dcfa24c8ca6 12 minutes ago 52.27 MB (virtual 183.8 MB)
brand_new_memcached latest 782a37534312 54 seconds ago 74.7 MB (virtual 350.7 MB)
ubuntu 12.04 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB)
ubuntu 12.10 b750fe79269d 4 months ago 24.65 kB (virtual 180.1 MB)
ubuntu latest 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB)
ubuntu precise 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB)
ubuntu quantal b750fe79269d 4 months ago 24.65 kB (virtual 180.1 MB)
memcached latest 1dcfa24c8ca6 12 minutes ago 52.27 MB (virtual 183.8 MB)
<none> <none> 1275893fed44 21 minutes ago 12.3 kB (virtual 566.4 MB)
Congratulations! You just created your first image with a Dockerfile :)
You can verify that memcached is installed in your image by running these commands:
root@precise64:/home/vagrant/dockerfiles# docker run -i -t brand_new_memcached /bin/bash root@c28a2c4be825:/# memcached can't run as root without the -u switch
Code should always be commented. The same rule applies to the Dockerfile.
A character #
at the beginning of a line defines a comment. The comments are not exectuted. Comments are not mandatory, but we recommend using them to:
# Memcached # # VERSION 1.0 # use the ubuntu base image provided by dotCloud FROM ubuntu # make sure the package repository is up to date RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update # install memcached RUN apt-get install -y memcached
As you could expect, the MAINTAINER
instruction is used to specify name and contact information of the maintainer of the Dockerfile.
Example:
MAINTAINER Guillaume J. Charmes<EMAIL_ADDRESS>The final version of the Dockerfile becomes
# Memcached # # VERSION 1.0 # use the ubuntu base image provided by dotCloud FROM ubuntu MAINTAINER Guillaume J. Charmes<EMAIL_ADDRESS># make sure the package repository is up to date RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update # install memcached RUN apt-get install -y memcached
Your best friend Eric Bardin sent you a Dockerfile, but some parts were lost in the ocean. Can you find the missing parts?
# This is a Dockerfile to create an image with Memcached and Emacs installed. # # VERSION 1.0 # use the ubuntu base image provided by dotCloud ub E B<EMAIL_ADDRESS># make sure the package repository is up to date echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list apt-get update # install memcached RUN apt-get install -y # install emacs apt-get install -y emacs23
In the next level, we will go into more detail about how to specify which command should be executed when the container starts, which user to use, and how expose a particular port.
Go to the next level